【发布时间】:2014-07-11 08:32:19
【问题描述】:
public class X {
Object o = (I & J) () -> {};
}
interface I {
public void foo();
}
interface J {
public void foo();
public void bar();
}
Oracle 编译器报错:
X.java:2: error: incompatible types: INT#1 is not a functional interface
Object o = (I & J) () -> {};
^
multiple non-overriding abstract methods found in interface INT#1
where INT#1 is an intersection type:
INT#1 extends Object,I,J
1 error
Eclipse 编译器编译正常。
哪个实现看起来正确?
上面例子的修改形式:
public class X {
Object o = (I & J) () -> {};
}
interface I {
public void foo();
}
interface J {
public void foo();
}
Eclipse 编译器抛出错误。 Oracle 编译器接受它。
我认为Oracle编译器是正确的。
考虑测试用例:
interface I {
default void foo() { System.out.println("foo I \n"); }
default void bar() { System.out.println("bar I \n"); }
}
interface J extends I {
default void foo() { System.out.println("foo J \n"); }
}
public class Y {
public static void main(String argv[]) throws Exception {
J j = new J() {
};
((I & J) j).foo();
((I & J) j).bar();
}
}
Oracle 和 Eclipse 编译器的输出是:
foo J
bar I
根据输出,我可以得出结论,Oracle 看起来是正确的。
让我知道你们是怎么理解的。
谢谢
【问题讨论】:
-
@Keppil Eclipse 编译器。
-
什么是eclipse编译器?
-
顺便说一句,你对第一种情况有什么期望,在交叉点有两个方法 => 接口不起作用?
-
我试图弄清楚在这种情况下交集案例是什么意思。我正在尝试找到一个独立于 lambdas 的示例。
-
我读过docs.oracle.com/javase/specs/jls/se5.0/html/…。在我看来,Oracle 在这种情况下是正确的。我将不得不验证。
标签: java eclipse lambda java-8