以下 Java 代码无法编译:
@FunctionalInterface
private interface BiConsumer<A, B> {
void accept(A a, B b);
}
private static void takeBiConsumer(BiConsumer<String, String> bc) { }
public static void main(String[] args) {
takeBiConsumer((String s1, String s2) -> new String("hi")); // OK
takeBiConsumer((String s1, String s2) -> "hi"); // Error
}
编译器报告:
Error:(31, 58) java: incompatible types: bad return type in lambda expression
java.lang.String cannot be converted to void
奇怪的是,标记为“OK”的行编译正常,但标记为“Error”的行编译失败。它们看起来本质上是相同的。
你的 lambda 需要与BiConsumer<String, String>
。如果您参考JLS #15.27.3(Lambda 类型) http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3:
如果满足以下所有条件,则 lambda 表达式与函数类型一致:
- [...]
- 如果函数类型的结果为 void,则 lambda 主体是语句表达式(第 14.8 节)或与 void 兼容的块。
因此 lambda 必须是语句表达式或 void 兼容块:
- 构造函数调用是语句表达式 http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.8所以它可以编译。
- 字符串文字不是语句表达式,并且不兼容 void(参见15.27.2 中的示例 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.2-230)所以它无法编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)