LambdaConversionException与泛型:JVM错误?

我有一些代码,其中包含方法引用,可以很好地编译并在运行时失败。


例外是:


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时,一切都很好。在我看来,一个结构按预期工作并在语义上等效就爆炸了。


这可能在规格中吗?我正在努力寻找一种方法,以使其在编译器或运行时中不成为问题,并且没有提出任何建议。


LEATH
浏览 878回答 3
3回答

qq_花开花谢_0

我刚刚在JDK9和JDK8u45中修复了此问题。看到这个错误。更改将需要一些时间才能渗透到升级后的版本中。Dan只是向我指出了这个StackOverflow问题,因此我要添加此注释。发现错误后,请提交它们。我通过让编译器创建桥来解决此问题,就像在许多复杂方法引用的情况下一样。我们还在研究规范的含义。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java