我在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表达式上不起作用,我会接受答案
Lambda表达式和匿名内部类不能编译为相同的byte-code
。
TypeReference
hack不适用于lambda,因为该API无法提供类型信息。顺便说一下,自Java 1.8以来一直是这样。