看来您碰到了JDK-8141508,这确实是
javac处理交集类型和方法引用时的一个错误。它计划在Java
9中修复。
引用来自Remi Forax的邮件:
javac对于作为lambda的目标类型和方法引用的交集类型有麻烦,通常在有交集类型时,javac用交集类型的第一种类型替换它,并在必要时添加强制类型转换。
假设我们有这段代码,
public class Intersection { interface I { } interface J { void foo(); } static <T extends I & J> void bar(T t) { Runnable r = t::foo; } public static void main(String[] args) { class A implements I, J { public void foo() {} } bar(new A()); } }当前,javac在J :: foo上使用带有I作为参数的invokedynamic生成方法引用,因此在运行时失败。javac应该将t ::
foo解糖到带有I的lambda中,然后将强制类型转换添加到J中,例如调用交集类型的方法。因此,解决方法是改用lambda
Runnable r = t -> t.foo();我已经在某处看到此错误,但无法在数据库中找到相应的错误报告:(
在您的代码中,由创建的Stream
Stream.of(E1.INSTANCE, E2.INSTANCE)是type
Stream<Enum<?>&Foo.X>,它结合了bug的所有元素:相交的类型和方法引用。
正如Remi Forax所指出的,解决方法是:
Stream.of(E1.INSTANCE, E2.INSTANCE).forEach(x -> x.x());
即使用显式lambda表达式而不是方法引用。



