Java lambda表达式中的返回类型错误
下面的代码在IntelliJ和Eclipse中编译得很好,但JDK编译器1.8.0_25对此表示不满。首先是代码Java lambda表达式中的返回类型错误,java,lambda,java-8,Java,Lambda,Java 8,下面的代码在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(MyPred
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);
}
}
import java.util.function.Predicate;
公共抽象类MyStream{
静态MyStream create(){
返回null;
}
抽象MyStream筛选器(MyPredicate如果lambda表达式出现在带有通配符的目标类型中(与大多数情况一样)
但是,隐式地,b
应推断为Boolean
。这是有意义的,因为消费者无论如何都应该只接受Boolean
如果T是通配符参数化的函数接口类型,并且lambda表达式是隐式类型的,则地面目标类型是T的非通配符参数化
(这可能假设通配符在目标类型上正确地使用了方差;如果假设不成立,我们可能会发现一些有趣的例子)是的,我也认为这是一个编译器错误。尝试解决方法过滤器((布尔b)->b))
否-而目标类型是谓词
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
MyPredicate<? super E>
MyPredicate<Object>
MyStream.<Boolean> create().filter(b -> Boolean.TRUE.equals(b));
Consumer<? super Boolean> consumer = b->{...}
Consumer<? super Boolean> consumer = (Object b)->{...}