Java 11 谓词 lambda 表达式泛型类型 ClassCastException
Java 11 Predicate lambda expression generic type ClassCastException
我在 java 11 谓词 lambda 表达式泛型类型上遇到问题,当我编写谓词时,因为 lambda 表达式没有返回准确的泛型参数,并且 ClassCastException
发生,代码如下所示
说明
当我们编写 lambda 表达式时,Generic Parameter method getGenericInterfaces()[0] -> ClassCastException
出现在这一行,因为当我调试代码时没有看到通用参数,被视为 Condition 而不是 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 不适用于匿名 class 和 lambda 表达式,我会接受答案
Lambda 表达式和匿名内部 类 不会编译成相同的 byte-code
。
TypeReference
hack 不适用于 lambda,因为无法通过此 API 获得类型信息。顺便说一句,从 Java 1.8.
开始就是这样
我在 java 11 谓词 lambda 表达式泛型类型上遇到问题,当我编写谓词时,因为 lambda 表达式没有返回准确的泛型参数,并且 ClassCastException
发生,代码如下所示
说明
当我们编写 lambda 表达式时,Generic Parameter method getGenericInterfaces()[0] -> ClassCastException
出现在这一行,因为当我调试代码时没有看到通用参数,被视为 Condition 而不是 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 不适用于匿名 class 和 lambda 表达式,我会接受答案
Lambda 表达式和匿名内部 类 不会编译成相同的 byte-code
。
TypeReference
hack 不适用于 lambda,因为无法通过此 API 获得类型信息。顺便说一句,从 Java 1.8.