Próbuję zrozumieć cel reified
słowa kluczowego, najwyraźniej pozwala nam to na refleksję na temat leków generycznych .
Jednak kiedy to pominę, działa równie dobrze. Czy ktoś chciałby wyjaśnić, kiedy to rzeczywiście robi różnicę ?
generics
kotlin
kotlin-reified-type-parameters
hl3mukkel
źródło
źródło
Odpowiedzi:
TL; DR: Co jest
reified
dobre dlaW treści funkcji ogólnej, takiej jak
myGenericFun
, nie można uzyskać dostępu do typu,T
ponieważ jest on dostępny tylko w czasie kompilacji, ale jest usuwany w czasie wykonywania. Dlatego jeśli chcesz użyć typu ogólnego jako normalnej klasy w treści funkcji, musisz jawnie przekazać klasę jako parametr, jak pokazano wmyGenericFun
.Jeśli utworzysz
inline
funkcję z reifiedT
, typT
można uzyskać nawet w czasie wykonywania, a zatem nie musiszClass<T>
dodatkowo przekazywać . Można pracować zT
tak jakby to było normalne klasy, na przykład może chcesz sprawdzić, czy zmienna jest instancjąT
, które można łatwo zrobić wtedy:myVar is T
.Taka
inline
funkcja zreified
typemT
wygląda następująco:Jak
reified
działaMożesz używać tylko
reified
w połączeniu zinline
funkcją . Taka funkcja powoduje, że kompilator kopiuje kod bajtowy funkcji w każde miejsce, w którym funkcja jest używana (funkcja jest „wstawiana”). Kiedy wywołujesz funkcję wbudowaną z typem reified, kompilator zna rzeczywisty typ używany jako argument typu i modyfikuje wygenerowany kod bajtowy, aby bezpośrednio używał odpowiedniej klasy. Dlatego wywołania takie jakmyVar is T
getmyVar is String
(jeśli argument typu byłString
) w kodzie bajtowym iw czasie wykonywania.Przykład
Spójrzmy na przykład, który pokazuje, jak pomocne
reified
może być. Chcemy utworzyć funkcję rozszerzającą dlaString
wywoływanej,toKotlinObject
która próbuje przekonwertować ciąg JSON na zwykły obiekt Kotlin o typie określonym przez typ ogólny funkcjiT
. Możemycom.fasterxml.jackson.module.kotlin
do tego użyć, a pierwsze podejście jest następujące:a) Pierwsze podejście bez typu zreifikowanego
readValue
Metoda zajmuje typ, który to ma do analizowaniaJsonObject
do. Jeśli spróbujemy pobraćClass
parametr typuT
, kompilator narzeka: „Nie można użyć 'T' jako parametru typu reified. Zamiast tego użyj klasy.”b) Obejście z jawnym
Class
parametremAby obejść ten problem,
Class
ofT
można ustawić jako parametr metody, który następnie zostanie użyty jako argument funkcjireadValue
. To działa i jest częstym wzorcem w ogólnym kodzie Java. Można to nazwać w następujący sposób:c) Droga Kotlina:
reified
Użycie
inline
funkcji zreified
parametrem typuT
umożliwia inną implementację funkcji:Nie ma potrzeby brać dodatkowego
Class
udziałuT
,T
można z niej korzystać tak, jakby to była zwykła klasa. Dla klienta kod wygląda następująco:Ważna uwaga: praca z Javą
Funkcja wstawiana z
reified
typem nie jest wywoływana z kodu Java .źródło
PROSTY
* reified to udzielenie pozwolenia na użycie w czasie kompilacji (aby uzyskać dostęp do funkcji T inside de)
na przykład:
używając takich jak:
źródło