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
Was ist der Unterschied zwischen () -> Unit
und (Unit) -> Unit
types? Warum kompiliert die erste Version von processEmpty
nicht?
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:
Während für () -> Unit
-Funktionen kein Argument übergeben werden muss:
In Ihrem Beispiel geschieht die Inferenz folgendermaßen: %Vor%
map: (T) -> U = { }
, also ein Ersatz für U
ist Unit
zurückgegeben von { }
. call
(Unit) -> Unit
sein. call: () -> Unit
ist nicht identisch mit (Unit) -> Unit
, wie oben angegeben. Fehler. Tags und Links kotlin