In einer normalen generischen Funktion wie
%Vor%Sie können nicht auf den Typ %code% zugreifen, da nur zur Kompilierzeit verfügbar ist , aber gelöscht zur Laufzeit. Wenn Sie also den generischen Typ als normale Klasse im Funktionskörper verwenden möchten, müssen Sie explizit die Klasse als Parameter übergeben , wie in %code% gezeigt.
Wenn Sie eine %code% -Funktion mit einem verdinglicht %code% erstellen, können Sie auch auf den Typ von %code% zugreifen, auch zur Laufzeit, so dass Sie %code% nicht übergeben müssen. zusätzlich. Sie können mit %code% so arbeiten, als wäre es eine normale Klasse, z. Vielleicht möchten Sie überprüfen, ob eine Variable eine Instanz von %code% ist, was Sie dann einfach tun können: %code% .
Eine solche Funktion %code% mit %code% type %code% sieht folgendermaßen aus:
%Vor%Sie können %code% nur in Kombination mit einer Funktion %code% verwenden. Eine solche Funktion bewirkt, dass der Compiler den Bytecode der Funktion an jede Stelle kopiert, an der die Funktion verwendet wird (die Funktion wird "inline"). Wenn Sie eine Inline-Funktion mit einem verdichteten Typ aufrufen, kennt der -Compiler den eigentlichen Typ, der als Typargument verwendet wird, und ändert den generierten Bytecode, um die entsprechende Klasse direkt zu verwenden. Daher werden Aufrufe wie %code% zu %code% (wenn das Typargument %code% war) im Bytecode und zur Laufzeit.
Sehen wir uns ein Beispiel an, das zeigt, wie hilfreich %code% sein kann. Wir möchten eine Erweiterungsfunktion für %code% namens %code% erstellen, die versucht, eine JSON-Zeichenfolge in ein einfaches Kotlin-Objekt mit einem Typ zu konvertieren, der vom generischen Typ der Funktion %code% angegeben wird. Wir können %code% dafür verwenden und der erste Ansatz ist folgender:
Erste Annäherung ohne verdichteten Typ
%Vor%Die Methode %code% verwendet einen Typ, mit dem %code% analysiert werden soll. Wenn wir versuchen, die %code% des Typparameters %code% zu erhalten, beschwert sich der Compiler: "Kann 'T' nicht als verdingter Typparameter verwenden. Stattdessen eine Klasse verwenden."
Umgehung mit explizitem %code% -Parameter
%Vor%Als Workaround kann der %code% von %code% zu einem Methodenparameter gemacht werden, der dann als Argument für %code% verwendet wird. Dies funktioniert und ist ein allgemeines Muster im generischen Java-Code. Es kann wie folgt aufgerufen werden:
%Vor%Der Kotlin-Weg: %code%
Die Verwendung einer Funktion %code% mit %code% type Parameter %code% ermöglicht es, die Funktion anders zu implementieren:
%Vor%Es ist nicht nötig, das %code% von %code% zusätzlich zu verwenden, %code% kann verwendet werden, als wäre es eine gewöhnliche Klasse. Für den Client sieht der Code so aus:
%Vor%Eine Inline-Funktion mit %code% type ist nicht aus Java -Code aufrufbar.
Ich versuche den Sinn des %code% Keywords zu verstehen, anscheinend es erlaubt uns, darüber nachzudenken Generika .
Aber wenn ich es weglasse, funktioniert es genauso gut. Will jemand erklären, wenn dies einen tatsächlichen Unterschied macht?