我有一些代码,其中包含方法引用,可以很好地编译并在运行时失败。
例外是:
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时,一切都很好。在我看来,一个结构按预期工作并在语义上等效就爆炸了。
这可能在规格中吗?我正在努力寻找一种方法,以使其在编译器或运行时中不成为问题,并且没有提出任何建议。
qq_花开花谢_0
相关分类