Eclipse/javac不同意使用默认方法冲突编译签名;谁是对的?
下面是一个演示该问题的简单类:
package com.mimvista.debug;
public class DefaultCollisionTest {
public static interface Interface1 {
public String getName();
}
public static interface Interface2 {
public default String getName() { return "Mr. 2"; };
}
public static <X extends Interface1&Interface2> String extractName(X target) {
return target.getName();
}
}
Eclipse (Neon 2) 愉快地编译了这个类,而 javac (JDK 1.8.0_121) 吐出了以下编译错误:
$ javac src/com/mimvista/debug/DefaultCollisionTest.java
src\com\mimvista\debug\DefaultCollisionTest.java:13: error: class INT#1 inherits abstract and default for getName() from types Interface2 and Interface1
public static <X extends Interface1&Interface2> String extractName(X target) {
^
where INT#1 is an intersection type:
INT#1 extends Object,Interface1,Interface2
1 error
我相信Eclipse在这种情况下是正确的,但我并不完全确定。根据我对“继承抽象和默认”错误的理解,我认为它应该只在编译实现这两个接口的实际声明类时生成。看起来javac可能正在底层生成一个中间类来处理该通用签名,并错误地将其置于默认方法碰撞测试之下?