Was ist der Unterschied zwischen () - Unit und (Unit) - Unit-Typen?

9

Ich habe folgende Funktionen:

%Vor%

aber das processEmpty kompiliert nicht. Die Fehlermeldung lautet Type mismatch: inferred type is () -> kotlin.Unit but (kotlin.Unit) -> kotlin.Unit was expected . Aber wenn ich diese Funktion zu

ändere %Vor%

Was ist der Unterschied zwischen () -> Unit und (Unit) -> Unit types? Warum kompiliert die erste Version von processEmpty nicht?

    
netimen 12.02.2016, 10:47
quelle

1 Antwort

19

Unit ist eigentlich ein Typ, der genau einen Wert hat (der Wert ist Unit selbst; auch deshalb heißt er Unit ). Es entspricht void in Java, aber es ist nicht dasselbe.

Der Kotlin-Compiler behandelt Funktionen mit keinem deklarierten Rückgabewert als Unit -returning-Funktionen , und return Unit können auch weggelassen werden. Deshalb ist { } eine Einheit zurückgebende Funktion.

Aber das gilt nicht für Argumente. Wenn Sie eine Funktion mit Unit Argument oder (Unit) -> Unit Funktionsvariable deklarieren, müssen Sie ein Argument vom Typ Unit an der Call-Site übergeben. Der einzige zu übergebende Wert ist Unit .

Ein Lambda ohne spezifizierte Argumente wie { doSomething() } wird sowohl als Funktion ohne Argumente als auch als Funktion mit dem einzelnen impliziten Argument it behandelt. Sie können { } sowohl als () -> Unit als auch als (Unit) -> Unit verwenden.

Bezüglich der Aufrufseite muss, wie oben gesagt, Unit übergeben werden:

%Vor%

Während für () -> Unit -Funktionen kein Argument übergeben werden muss:

%Vor%

In Ihrem Beispiel geschieht die Inferenz folgendermaßen: %Vor%
  1. map: (T) -> U = { } , also ein Ersatz für U ist Unit zurückgegeben von { } .
  2. Daher sollte call (Unit) -> Unit sein.
  3. call: () -> Unit ist nicht identisch mit (Unit) -> Unit , wie oben angegeben. Fehler.
hotkey 12.02.2016, 11:18
quelle

Tags und Links