以下代码在Java 1.8虚拟机中完美运行,但在Java 11虚拟机中执行时会产生LambdaConversionException
。有何区别,为何会出现这种情况?
代码:
public void addSomeListener(Component comp){
if(comp instanceof HasValue) {
((HasValue<?,?>) comp).addValueChangeListener(evt -> {
//do sth with evt
});
}
}
异常(仅适用于V11):
Caused by: java.lang.invoke.LambdaConversionException: Type mismatch
for instantiated parameter 0: class java.lang.Object is not a subtype
of interface com.vaadin.flow.component.HasValue$ValueChangeEvent
at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.checkDescriptor(AbstractValidatingLambdaMetafactory.java:308)
at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:294)
at java.base/java.lang.invoke.LambdaMetafactory.altMetafactory(LambdaMetafactory.java:503)
at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:138)
... 73 more
解决方法:
ValueChangeListener<ValueChangeEvent<?>> listener = evt -> {
// do sth with evt
};
((HasValue<?,?>) comp).addValueChangeListener(listener);
系统:
操作系统:Windows 10
IDE:Eclipse 2018-12 (4.10.0)
Java(编译):ecj
Java(Web服务器):JDK 11.0.2
Web服务器:Wildfly 15
(HasValue<?,?>) comp
这个东西...虽然同意这样的验证在JDK-8代码中不存在。 - NamanaddSomeListener
方法。它可以正常工作,没有出现错误,并且当更改TextField的值时,添加的监听器会按预期执行。(使用jetty和Java 11进行测试:jetty-9.4.11.v20180605; built: 2018-06-05T18:24:03.829Z; git: d5fc0523cfa96bfebfbda19606cad384d772f04c; jvm 11.0.1+13
) - codinghausjavac
。 - Holger