编译错误:Lambda 目标类型交集类型

2024-03-20

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(使用前将#替换为@)

编译错误:Lambda 目标类型交集类型 的相关文章

随机推荐