Warum erzeugt das folgende Casting mit der Methodenreferenz keinen Kompilierungsfehler? [Duplikat]

23
%Vor%

Ich verstehe nicht warum: Consumer<Integer> c = SomeClass::someFunction; erzeugt keinen Kompilierungsfehler, da die Funktion someFunction eine Methode mit Rückgabewert ist und Consumer Methoden ohne Rückgabewert darstellt

    
eitann 08.03.2018, 12:40
quelle

2 Antworten

23

Von die Spezifikation :

  

Wenn der Körper eines Lambda ein Ausdruck einer Aussage ist (dh ein   Ausdruck, der als Aussage allein stehen sollte), ist es   kompatibel mit einem void-produzierenden Funktionstyp; jedes Ergebnis ist einfach   verworfen.

Gleiches gilt für Methodenreferenzen.

Es ist flexibler auf diese Weise. Angenommen, es wäre ein Compilerfehler, wenn Sie beim normalen Aufruf einer Methode keinen Rückgabewert verwenden würden - das wäre unglaublich nervig . Sie müssten am Ende falsche Variablen verwenden, die Sie in einigen Fällen nicht interessieren.

%Vor%

Wenn Sie eine vollständige formale Definition dessen wünschen, was akzeptabel ist, lesen Sie 15.13.2. Typ einer Methodenreferenz .

    
Michael 08.03.2018, 12:42
quelle
12

Dies wird spezielle void compatibility rule genannt. Zum Beispiel, wie oft haben Sie sich tatsächlich um List#add return type gekümmert? Selbst wenn es true/false zurückgibt.

Genau so, hier können Sie eine Methode aufrufen, aber ihr Ergebnis ignorieren. Wenn Sie Ihren Consumer als Lambda-Ausdruck neu schreiben, ergibt das mehr Sinn:

%Vor%

Wenn ich mich richtig an die JLS erinnere, sind nur einige Typen dafür erlaubt.

%Vor%     
Eugene 08.03.2018 14:10
quelle

Tags und Links