LambdaConversionException with generics: JVM bug?
我有一些带有方法引用的代码,该方法编译良好并在运行时失败。
例外情况是:
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());
}
}
尝试解决 时引发异常。 在 中声明。据我所知,我得到了例外,因为E的擦除是和JVM不(不能?)考虑E上的其他边界。entity::filename
filename()
HasImagesEntity
BasicEntity
当我将方法引用重写为一个简单的 lambda 时,一切都很好。在我看来,一个结构按预期工作,而它的语义等价物爆炸了,这似乎真的很可疑。
这可能在规范中吗?我非常努力地想找到一种方法,使这不会成为编译器或运行时的问题,并且没有提出任何东西。