多重继承的奇怪行为 - Java 8
Mutilple inheritance strange behavior - Java 8
在下面的代码中,如果我取消注释 I3
并实现 I2
和 I3
,则会出现 compilation
失败并出现以下错误:
unrelated defaults for m2() from I3 and I2
这是正常且符合预期的行为。
但是,当我将 I3
替换为 I
时,它编译成功并且我得到 I2
作为输出。
public class DefaultMethodTest implements I, I2 {
public static void main(String[] args) {
DefaultMethodTest obj = new DefaultMethodTest();
obj.m2();
}
}
interface I {
default void m2() {
System.out.println("I1");
}
}
interface I2 extends I {
default void m2() {
System.out.println("I2");
}
}
//interface I3 extends I {
//
// default void m2() {
// System.out.println("I3");
// }
//}
现在我有几个问题:
为什么第二种情况下没有compilation
失败
接口具有相同的默认方法 m2
?
为什么 I2
优先于 I
?
根据默认方法解析规则,将选择最具体的默认提供接口中的默认方法。在您的情况下, I 和 I2 都有一个具有相同签名的默认方法(每个)。因此,它将选择 I2,这是您的 最具体的默认提供接口 。
另一方面,如果您 implement I2, I3
,将会有您需要解决的冲突(通过在您的 class 中实现 m2
)。
参考文献:
http://www.lambdafaq.org/how-are-conflicting-method-declarations-resolved/
https://javadevcentral.com/default-method-resolution-rules
在下面的代码中,如果我取消注释 I3
并实现 I2
和 I3
,则会出现 compilation
失败并出现以下错误:
unrelated defaults for m2() from I3 and I2
这是正常且符合预期的行为。
但是,当我将 I3
替换为 I
时,它编译成功并且我得到 I2
作为输出。
public class DefaultMethodTest implements I, I2 {
public static void main(String[] args) {
DefaultMethodTest obj = new DefaultMethodTest();
obj.m2();
}
}
interface I {
default void m2() {
System.out.println("I1");
}
}
interface I2 extends I {
default void m2() {
System.out.println("I2");
}
}
//interface I3 extends I {
//
// default void m2() {
// System.out.println("I3");
// }
//}
现在我有几个问题:
为什么第二种情况下没有
compilation
失败 接口具有相同的默认方法m2
?为什么
I2
优先于I
?
根据默认方法解析规则,将选择最具体的默认提供接口中的默认方法。在您的情况下, I 和 I2 都有一个具有相同签名的默认方法(每个)。因此,它将选择 I2,这是您的 最具体的默认提供接口 。
另一方面,如果您 implement I2, I3
,将会有您需要解决的冲突(通过在您的 class 中实现 m2
)。
参考文献:
http://www.lambdafaq.org/how-are-conflicting-method-declarations-resolved/ https://javadevcentral.com/default-method-resolution-rules