我有一些代碼,其中包含方法引用,可以很好地編譯并在運行時失敗。例外是: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
提交
取消