我有一些代码,其中包含方法引用,可以很好地编译并在运行时失败。例外是:Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class redacted.BasicEntity; not a subtype of implementation type interface redacted.HasImagesEntity at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:233) at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303) at java.lang.invoke.CallSite.makeSite(CallSite.java:289)触发异常的类:class ImageController<E extends BasicEntity & HasImagesEntity> { void doTheThing(E entity) { Set<String> filenames = entity.getImages().keySet().stream() .map(entity::filename) .collect(Collectors.toSet()); }}试图解决该异常entity::filename。filename()在中声明HasImagesEntity。据我所知,我得到了例外,因为E的擦除是BasicEntity,而JVM不会(不能?)考虑E的其他范围。当我将方法引用重写为琐碎的lambda时,一切都很好。在我看来,一个结构按预期工作并在语义上等效就爆炸了。这可能在规格中吗?我正在努力寻找一种方法,以使其在编译器或运行时中不成为问题,并且没有提出任何建议。
3 回答
qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
我刚刚在JDK9和JDK8u45中修复了此问题。看到这个错误。更改将需要一些时间才能渗透到升级后的版本中。Dan只是向我指出了这个StackOverflow问题,因此我要添加此注释。发现错误后,请提交它们。
我通过让编译器创建桥来解决此问题,就像在许多复杂方法引用的情况下一样。我们还在研究规范的含义。
添加回答
举报
0/150
提交
取消