【发布时间】:2018-12-15 15:58:59
【问题描述】:
最好在代码中表达这种行为:
List<Integer> list= new ArrayList<>();
Stream.of(1,2,3).forEach(i -> list.add(1)); // COMPILES
Stream.of(1,2,3).forEach(i -> true); // DOES NOT COMPILE!
forEach(...)接受Consumer,但是如果List接口有以下签名boolean add(E e),为什么第一个例子编译?而第二个产生:
lambda 表达式中的返回类型错误:布尔值无法转换为 无效
【问题讨论】:
-
你想用第二个语句达到什么目的?
-
提示:
Stream.of(1,2,3).forEach(i -> {return list.add(1);})也无法编译。提示2:什么方法(X -> Y映射)Consumer<T>代表(看看它包含的抽象方法,它接受什么类型的参数以及它的返回类型)? -
与其简单地声明“不编译”,不如显示您收到的精确错误消息会好得多。特别是,至少有一个答案是在假设您遇到语法错误的情况下运行的(尽管在这种情况下,“不解析”会比“不编译”更正确),但我不认为语法错误就是问题所在。
-
@JörgWMittag 编译错误打印
incompatible types: bad return type in lambda expression missing return value。 @Pshemo 在我开始这个线程之前我检查了签名是什么。Consumer.accept(T t)应该返回void(docs.oracle.com/javase/8/docs/api/java/util/function/…) -
@LeonidDashko 当我在 IntelliJ IDEA 上运行它时,我收到了我在帖子中包含的错误。但是,由于它与您刚刚提到的内容不同,请考虑使用确切信息更新帖子。
标签: java java-8 compiler-errors java-stream