Warum tut dieses Java 8 lambda nicht kompilieren?

Den folgenden Java-code compilieren zu:

@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
}

Meldet der compiler:

Error:(31, 58) java: incompatible types: bad return type in lambda expression
    java.lang.String cannot be converted to void

Komisch ist, dass die Zeile "OK" kompiliert in Ordnung, aber die Zeile "Error" fehl. Sie scheinen im wesentlichen identisch.

ist es ein Tippfehler, dass hier die funktionale interface-Methode void zurückgibt?
NÖ. Es stellt sich heraus, dass im Mittelpunkt der Frage - siehe die akzeptierte Antwort.
sollte es code innerhalb der { } von takeBiConsumer ... und wenn ja, könnten Sie ein Beispiel geben ... wenn ich das richtig gelesen, bc ist eine Instanz der Klasse/Schnittstelle BiConsumer, und so sollte eine Methode namens accept entsprechen die interface-Signatur ... ... und wenn das richtig ist, dann sind die accept Methode muss irgendwo definiert sein (z.B. eine Klasse, die die Schnittstelle implementiert) ... so ist das, was sollte in der {}?? ... ... ... danke
Schnittstellen mit einer einzigen Methode sind austauschbar mit Lambda-Ausdrücke in Java 8. In diesem Fall (String s1, String s2) -> "hi" ist eine Instanz von BiConsumer<String,String>.

InformationsquelleAutor Brian Gordon | 2015-03-25

Schreibe einen Kommentar