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 看起来是正确的。
让我知道你们如何解释它。
Thanks
在第一个例子中,I&J
不是一个函数式接口(仅具有一个抽象非对象方法的接口)。所以javac报错是正确的。
在第二种情况下,I&J
是一个函数式接口,所以 javac 又是正确的。
听起来像是 Eclipse 编译器中的两个错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)