kotlin-reified-type-parameters

___ tag123generics ___ Generika sind eine Form von parametrischer Polymorphie, die in einer Reihe von Sprachen gefunden wird, einschließlich .NET-Sprachen, Java und Swift. ___ tag123kotlin ___ Kotlin ist eine Open-Source, statisch typisierte Programmiersprache, die von JetBrains unterstützt wird. Kotlin kombiniert OO- und Funktionsmerkmale und konzentriert sich auf Interoperabilität, Sicherheit, Übersichtlichkeit und Werkzeugunterstützung. Es zielt derzeit auf die JVM und JavaScript, und es ist eine offiziell unterstützte Sprache auf Android. ___ tag123kotlinerifiedtypeparameters ___ verweist zur Laufzeit auf den Typ und arbeitet nur für die Inline-Funktion ___ answer45952201 ___

TL; DR: Was ist %code% gut für

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%

Wie funktioniert %code%

?

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.

Beispiel

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%

Wichtiger Hinweis: Arbeiten mit Java

Eine Inline-Funktion mit %code% type ist nicht aus Java -Code aufrufbar.

    
___ qstntxt ___

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?

    
___ qstnhdr ___ Wie funktioniert das verdinglichte Keyword in Kotlin? ___
1
Antwort

Wie funktioniert das verdinglichte Keyword in Kotlin?

Ich versuche den Sinn des reified 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...
29.08.2017, 23:11