Java用相同的方法在一个类中实现两个接口哪种接口方法被覆盖?
如果一个类型实现两个接口,并且每个接口interface定义一个具有相同签名的方法,则实际上只有一个方法,并且它们是不可区分的。例如,如果这两个方法的返回类型冲突,那么它将是编译错误。这是继承,方法重写,隐藏和声明的一般规则,并且不仅适用于两个继承的interface方法之间的可能冲突,还适用于an interface和super class方法之间的冲突,甚至仅适用于泛型类型擦除引起的冲突。
相容性范例在下面的示例中,你有一个interface Gift具有present()方法(例如,赠送礼物)的和interface Guest,还具有一种present()方法(例如,客人在场并且不在场)。
Presentable johnny既是Gift和Guest。
public class InterfaceTest { interface Gift { void present(); } interface Guest { void present(); } interface Presentable extends Gift, Guest { } public static void main(String[] args) {Presentable johnny = new Presentable() { @Override public void present() {System.out.println('Heeeereee’s Johnny!!!'); }};johnny.present(); // 'Heeeereee’s Johnny!!!'((Gift) johnny).present(); // 'Heeeereee’s Johnny!!!'((Guest) johnny).present(); // 'Heeeereee’s Johnny!!!'Gift johnnyAsgift = (Gift) johnny;johnnyAsgift.present(); // 'Heeeereee’s Johnny!!!'Guest johnnyAsGuest = (Guest) johnny;johnnyAsGuest.present(); // 'Heeeereee’s Johnny!!!' }}
上面的代码片段将编译并运行。
请注意,只有一个 @Override 必要条件!!!。这是因为Gift.present()和Guest.present()是“- @Override等效的”(JLS 8.4.2)。
因此,johnny只有一个执行的present(),并不要紧,你如何对待johnny,无论是作为Gift或作为Guest,只有一个调用方法。
不兼容示例这是两个不@Override等效的继承方法的示例:
public class InterfaceTest { interface Gift { void present(); } interface Guest { boolean present(); } interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!! // 'types InterfaceTest.Guest and InterfaceTest.Gift are incompatible; // both define present(), but with unrelated return types'}
这进一步重申,从interface必须继承成员必须遵守成员声明的一般规则。下面我们就Gift和Guest定义present()不兼容的返回类型:一个void其他的boolean。由于不能同时使用an void present()和boolean present()in的原因,此示例导致编译错误。
摘要你可以继承@Override-equivalent的方法,但要遵循方法重写和隐藏的通常要求。由于它们是 @Override等效的,因此实际上只有一种方法可以实现,因此没有区别/选择的地方。
编译器不必标识哪个方法用于哪个接口,因为一旦确定@Override它们等效,它们就是相同的方法。
解决潜在的不兼容性可能是一项艰巨的任务,但这是另一个问题。
解决方法具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何确定哪个方法用于哪个接口?
例如:
interface A{ int f();}interface B{ int f();}class Test implements A,B{ public static void main(String... args) throws Exception{ } @Override public int f() { // from which interface A or B return 0; }}
相关文章:
1. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)2. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题3. 导入phpmyadmin的时候报错了4. MySQL能否给某个字段的值设置有效期?5. mysql数据库做关联一般用id还是用户名6. MySQL 如何 SELECT 除去某一列的所有列?7. MYSQL新建用户设置可以远程访问的问题8. 求一个mySQL安装包9. node.js - 我想让最后进入数据库的数据,在前台最先展示,如何做到?10. MySQL 这句 创建表结构语句的错误在哪?
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)