2014-06-24 12 views
7

Ich lerne nur über neue Java8 Funktionen. Und hier ist meine Frage:Callable <Void> als funktionale Schnittstelle mit Lambdas

Warum ist es nicht erlaubt, als funktionale Schnittstelle für Lambda-Ausdrücke zu verwenden? (Compiler beklagt sich über Rückgabewert) Und es ist immer noch völlig legal Callable<Integer> dort zu verwenden. Hier ist der Beispielcode:

public class Test { 
    public static void main(String[] args) throws Exception { 
     // works fine 
     testInt(() -> { 
      System.out.println("From testInt method"); 
      return 1; 
     }); 

     testVoid(() -> { 
      System.out.println("From testVoid method"); 
      // error! can't return void? 
     }); 
    } 

    public static void testInt(Callable<Integer> callable) throws Exception { 
     callable.call(); 
    } 

    public static void testVoid(Callable<Void> callable) throws Exception { 
     callable.call(); 
    } 
} 

Wie dieses Verhalten zu erklären?

+1

könnten Sie hier nicht 'Runnable' verwenden, wenn Sie keinen Rückgabewert haben? (Ich bin noch nicht vertraut mit Java8) – Thilo

+0

@Thilo: Ein Vorteil der Verwendung von Callable ist, dass es eine Zukunft zurückgibt, die später für andere Zwecke verwendet werden kann, z. B. das Löschen einer Aufgabe, die zu lange ausgeführt wird. – devdanke

+0

Auch Callable kann unkontrollierte Ausnahme auslösen, während Runnable nicht kann – Greg

Antwort

20

Für eine Void Methode (unterscheidet sich von einem void-Methode), müssen Sie null zurück.

Void ist nur ein Platzhalter, der angibt, dass Sie eigentlich keinen Rückgabewert haben (obwohl das Konstrukt - wie Callable here - eines benötigt). Der Compiler behandelt sie nicht auf besondere Weise, Sie müssen also selbst eine "normale" Return-Anweisung eingeben.

+0

Siehe http://docs.oracle.com/javase/8/docs/api/java/lang/Void.html – Keppil

+0

Smart. Ich dachte, es könnte einfach nicht herausfinden, welche es aufrufen sollte und die statischen Funktionen sollten generisch sein, um den Parameter für Callable bereitzustellen, aber ich denke nicht. Du lernst jeden Tag etwas Neues. – EpicPandaForce

+0

Ja, schön. 'return null' funktioniert gut, aber die einfache 'return'-Anweisung funktioniert nicht, und ich kann nicht verstehen warum. – ferrerverck