次のコードは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からの出力は次のとおりです。私は単にE
と? super E
を交換した場合
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
、JDKが正常にコンパイルされます。
をfilter(Predicate
に置き換えると、JDKは正常にコンパイルされます。
JDK 1.8.0_60と動作するので、コンパイラのバグだと思われます。
これを引き起こした原因と修正された原因についての詳細はありますか?
はい、あまりにもコンパイラのバグだと思います。'filter((Boolean b) - > b))' – ZhongYu