第一种情况是好的,因为你正在调用一个“特殊”方法(一个构造函数)而你实际上并没有采用创建的对象。 为了更清楚,我将把可选的括号放在你的lambdas中:
takeBiConsumer((String s1, String s2) -> {new String("hi");}); // OK
takeBiConsumer((String s1, String s2) -> {"hi"}); // Error
更清楚的是,我会将其翻译成较旧的符号:
takeBiConsumer(new BiConsumer(String s1, String s2) {
public void accept(String s, String s2) {
new String("hi"); // OK
}
});
takeBiConsumer(new BiConsumer(String s1, String s2) {
public void accept(String s, String s2) {
"hi"; // Here, the compiler will attempt to add a "return"
// keyword before the "hi", but then it will fail
// with "compiler error ... bla bla ...
// java.lang.String cannot be converted to void"
}
});
在第一种情况下,您正在执行构造函数,但是您没有返回创建的对象,在第二种情况下,您尝试返回String值,但是您的接口BiConsumer中的方法返回void,因此编译器错误。