Java lambda表达式中的返回类型错误

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

下面的代码在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);
  }
}
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)->{...}