【发布时间】:2018-01-09 16:22:57
【问题描述】:
下面的代码居然编译成功了:
Consumer<String> p = ""::equals;
这也是:
p = s -> "".equals(s);
但这是失败的错误boolean cannot be converted to void正如预期的那样:
p = s -> true;
用括号修改第二个例子也失败了:
p = s -> ("".equals(s));
这是 Java 编译器中的错误还是我不知道的类型推断规则?
【问题讨论】:
-
Eclipse 也会抱怨,所以可能不是编译器错误。
-
s -> true;和s -> ("".equals(s))被解释为s -> {return true;}或s -> { return ("".equals(s));}并且它们不是Function<String, Boolean>。p = s -> true;这没有意义,请改用p = s -> {};。 -
@DavidPérezCabrera 我明白为什么最后两行代码没有编译。不清楚后两个是否有效。
-
@Zefick 恕我直言,这是编译器的许可证,它必须解释您可以忽略返回值。为避免不必要的冗长,如果它不这样做,则不能使用
p = ""::equals;,并且必须将p = s -> "".equals(s);定义为:p = s -> {"".equals(s);};。恕我直言,这是一个很好的决定。
标签: java lambda java-8 type-inference