Ich versuche, den Zweck des reified
Schlüsselworts zu verstehen. Anscheinend können wir damit über Generika nachdenken .
Wenn ich es jedoch weglasse, funktioniert es genauso gut. Möchte jemand erklären, wann dies tatsächlich einen Unterschied macht ?
generics
kotlin
kotlin-reified-type-parameters
hl3mukkel
quelle
quelle
Antworten:
TL; DR: Wofür ist das
reified
gut ?Im Hauptteil einer generischen Funktion wie
myGenericFun
können Sie nicht auf den Typ zugreifen,T
da er nur zur Kompilierungszeit verfügbar ist, aber zur Laufzeit gelöscht wird. Wenn Sie den generischen Typ als normale Klasse im Funktionskörper verwenden möchten, müssen Sie die Klasse daher explizit als Parameter übergeben, wie in gezeigtmyGenericFun
.Wenn Sie jedoch eine
inline
Funktion mit einem Reified erstellenT
, kann auf den Typ vonT
auch zur Laufzeit zugegriffen werden, sodass Sie die Funktion nichtClass<T>
zusätzlich übergeben müssen. Sie können damit arbeiten,T
als wäre es eine normale Klasse, z. B. möchten Sie möglicherweise überprüfen, ob eine Variable eine Instanz von istT
, was Sie dann einfach tun können:myVar is T
.Eine solche
inline
Funktion mitreified
TypT
sieht wie folgt aus:Wie
reified
funktioniertSie können nur
reified
in Kombination mit einerinline
Funktion verwenden . Durch eine solche Funktion kopiert der Compiler den Bytecode der Funktion an jede Stelle, an der die Funktion verwendet wird (die Funktion wird "inline"). Wenn Sie eine Inline-Funktion mit reifiziertem Typ aufrufen, kennt der Compiler den tatsächlichen Typ, der als Typargument verwendet wird, und ändert den generierten Bytecode, um die entsprechende Klasse direkt zu verwenden. Daher werden Aufrufe wiemyVar is T
werdenmyVar is String
(wenn das Typargument wäreString
) im Bytecode und zur Laufzeit.Beispiel
Schauen wir uns ein Beispiel an, das zeigt, wie hilfreich es sein
reified
kann. Wir möchten eine Erweiterungsfunktion fürString
aufgerufene erstellentoKotlinObject
, die versucht, eine JSON-Zeichenfolge in ein einfaches Kotlin-Objekt mit einem Typ zu konvertieren, der durch den generischen Typ der Funktion angegeben wirdT
. Wir könnencom.fasterxml.jackson.module.kotlin
dies verwenden und der erste Ansatz ist der folgende:a) Erster Ansatz ohne reifizierten Typ
Die
readValue
Methode verwendet einen Typ, den sie analysierenJsonObject
soll. Wenn wir versuchen, denClass
Parameter type zu erhaltenT
, beschwert sich der Compiler: "'T' kann nicht als reifizierter Typparameter verwendet werden. Verwenden Sie stattdessen eine Klasse."b) Problemumgehung mit expliziten
Class
ParameternAls Problemumgehung kann das
Class
ofT
zu einem Methodenparameter gemacht werden, der dann als Argument für verwendet wirdreadValue
. Dies funktioniert und ist ein allgemeines Muster im generischen Java-Code. Es kann wie folgt aufgerufen werden:c) Der Kotlin-Weg:
reified
Die Verwendung einer
inline
Funktion mitreified
TypparameterT
ermöglicht es, die Funktion anders zu implementieren:Es gibt keine Notwendigkeit , das nehmen
Class
vonT
zusätzlich,T
kann verwendet werden , als ob es sich um eine normale Klasse. Für den Client sieht der Code folgendermaßen aus:Wichtiger Hinweis: Arbeiten mit Java
Eine Inline-Funktion mit
reified
Typ kann nicht über Java- Code aufgerufen werden.quelle
EINFACH
* reified ist die Erlaubnis zur Verwendung zur Kompilierungszeit zu geben (um auf T inside de function zuzugreifen)
z.B:
mit like:
quelle