我在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上创建了问题
如果他们说TypeReference
Hack不适用于匿名类和lambda表达式,我会接受答案
Lambda 表达式和匿名内部类不会编译为同一byte-code
。
TypeReference
hack 不适用于 lambda,因为无法通过此 API 获得类型信息。顺便说一下,从Java 1.8开始就是这样。