我在 java 11 谓词 lambda 表达式泛型类型上遇到问题,当我将谓词编写为 lambda 表达式时,未完全返回泛型参数,并且 ClassCastException
发生,代码如下所示
说明
当我们写lambda表达式时,泛型参数方法getGenericInterfaces()[0] -> ClassCastException
出现这一行是因为我调试代码时没有看到通用参数,被视为只是 Condition not 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;
接口(interface)定义
@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 表达式和匿名内部类不会编译为相同的字节码
。
TypeReference
hack 不适用于 lambda,因为类型信息无法通过此 API 获得。顺便说一下,从 Java 1.8 开始就是这样。
关于Java 11 谓词 lambda 表达式泛型类型 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648713/