【发布时间】:2015-10-12 15:45:33
【问题描述】:
以下代码在 IntelliJ 和 Eclipse 中编译良好,但 JDK 编译器 1.8.0_25 报错。首先是代码。
import java.util.function.Predicate;
public abstract class MyStream<E> {
static <T> MyStream<T> create() {
return null;
}
abstract MyStream<E> filter(MyPredicate<? super E> predicate);
public interface MyPredicate<T> extends Predicate<T> {
@Override
boolean test(T t);
}
public void demo() {
MyStream.<Boolean> create().filter(b -> b);
MyStream.<String> create().filter(s -> s != null);
}
}
javac 1.8.0_25 的输出是:
MyStream.java:18: error: incompatible types: incompatible parameter types in lambda expression
MyStream.<Boolean> create().filter(b -> b);
^
MyStream.java:18: error: incompatible types: bad return type in lambda expression
MyStream.<Boolean> create().filter(b -> b);
^
? super Boolean cannot be converted to boolean
MyStream.java:19: error: bad operand types for binary operator '!='
MyStream.<String> create().filter(s -> s != null);
^
first type: ? super String
second type: <null>
MyStream.java:19: error: incompatible types: incompatible parameter types in lambda expression
MyStream.<String> create().filter(s -> s != null);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
4 errors
当我用简单的E 替换? super E 时,JDK 编译成功。
当我将filter(MyPredicate 替换为filter(Predicate 时,JDK 编译成功。
由于它适用于 JDK 1.8.0_60,我怀疑这是一个编译器错误。
有关导致此问题的原因以及何时修复的任何详细信息?
【问题讨论】:
-
是的,我也相信这是一个编译器错误。尝试解决方法
filter((Boolean b)->b))