Java 11谓词lambda表达式通用类型ClassCastException

问题描述 投票:0回答:1

我在Java 11谓词lambda表达式泛型类型上遇到问题,当我编写谓词时,因为lambda表达式未完全返回泛型参数,并且发生ClassCastException,代码如下所示

说明当我们编写lambda表达式时,此行出现通用参数方法getGenericInterfaces()[0]-> ClassCastException,因为在调试代码时没有通用参数被看到,即条件而不是条件<>,无论如何当我们定义谓词时,如下所示(工作案例),其工作

工作案例

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表达式上不起作用,我会接受答案

java predicate java-11
1个回答
0
投票

Lambda表达式和匿名内部类不能编译为相同的byte-code

TypeReference hack不适用于lambda,因为该API无法提供类型信息。顺便说一下,自Java 1.8以来一直是这样。

© www.soinside.com 2019 - 2024. All rights reserved.