【发布时间】:2015-05-29 11:56:58
【问题描述】:
以下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”的行编译失败。它们看起来基本相同。
【问题讨论】:
-
函数式接口方法返回void是不是这里打错了?
-
@NathanHughes 不。事实证明它是问题的核心 - 请参阅已接受的答案。
-
takeBiConsumer的{ }内是否应该有代码...如果是这样,您能举个例子...如果我没看错的话,bc是类/接口BiConsumer,因此应该包含一个名为accept的方法来匹配接口签名……如果这是正确的,那么accept方法需要在某个地方定义(例如一个类实现了接口)......那么{}中应该是什么?? ... ... ... 谢谢 -
具有单个方法的接口可以与 Java 8 中的 lambda 互换。在这种情况下,
(String s1, String s2) -> "hi"是 BiConsumer的一个实例。
标签: java lambda compiler-errors java-8 void