gpt4 book ai didi

Java 11 谓词 lambda 表达式泛型类型 ClassCastException

转载 作者:行者123 更新时间:2023-12-02 09:08:03 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com