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

标签 java predicate java-11

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

相关文章:

java - 使用蒙特卡罗方法计算 pi java - 计算不起作用

java - Mapreduce - 保留输入顺序

java - 使用泛型和继承来谓词 java 8

java - 即时创建谓词

java - 在方法中使用通用谓词和函数

java - EasyMock - 调用具有不同签名的方法时行为发生变化

java - spark java api 有像 hadoop MultipleOutputs/FSDataOutputStream 这样的类吗?

java - 重新排列项目而不改变所有项目的排名

java - 从 Java 8 迁移到 java 11 - 无法加载 jdk.internal.util 类 (java.lang.NoClassDefFoundError)

android - 使用 Java 11 运行 sonarqube-gradle-plugin :3. 3 时出错