Java 11 Predicate lambda 表达式泛型类型 ClassCastException



我在java 11谓词lambda表达式泛型类型上遇到问题,当我将谓词写为lambda表达式时,并没有返回确切的泛型参数,并且ClassCastException发生,代码如下所示

解释当我们编写lambda表达式时,泛型参数方法getGenericInterfaces()[0] -> ClassCastException出现这一行,因为我调试代码时没有看到泛型参数,只看作条件不Condition<<Integer>>,反正当我们定义谓词时,如下所示(工作情况(,它的工作

工作案例

Condition<Integer> oddValueCondition = new Condition<Integer>() {
@Override
public boolean test(Integer integer) {
return integer % 2 == 0;
}
};

不工作案例

Condition<Integer> oddValueCondition = integer -> integer % 2 == 0;

接口定义

@FunctionalInterface
public interface Condition<T> extends Predicate<T> {
default Class<T> getParameterType() {
ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericInterfaces()[0];
Type[] typeArguments = parameterizedType.getActualTypeArguments();
Class<T> type = (Class<T>) typeArguments[0];
return type;
}
}

测试

oddValueCondition.getParameterType();

那么你认为问题是什么,在写lambda表达式的时候?

我还在github OpenJDK上创建了问题

如果他们说TypeReferenceHack不适用于匿名类和lambda表达式,我会接受答案

Lambda 表达式和匿名内部类不会编译为同一byte-code

TypeReferencehack 不适用于 lambda,因为无法通过此 API 获得类型信息。顺便说一下,从Java 1.8开始就是这样。

相关内容

  • 没有找到相关文章

最新更新