Я пытаюсь понять цель reified
ключевого слова, по-видимому, оно позволяет нам размышлять о дженериках .
Однако, когда я оставляю это, это работает так же хорошо. Кто-нибудь хочет объяснить, когда это имеет значение ?
generics
kotlin
kotlin-reified-type-parameters
hl3mukkel
источник
источник
Ответы:
TL; DR: что
reified
хорошо дляВ теле общей функции, такой как
myGenericFun
, вы не можете получить доступ к типу,T
потому что он доступен только во время компиляции, но стирается во время выполнения. Поэтому, если вы хотите использовать универсальный тип в качестве обычного класса в теле функции, вам нужно явно передать класс в качестве параметра, как показано вmyGenericFun
.Если вы создаете
inline
функцию с помощью reified,T
то к ее типуT
можно обращаться даже во время выполнения, и, таким образом, вам не нужноClass<T>
дополнительно передавать . Вы можете работать сT
как если бы это был обычный класс, например , вы можете захотеть , чтобы проверить , является ли переменная является экземпляромT
, который вы можете легко сделать , то:myVar is T
.Такая
inline
функция сreified
типомT
выглядит следующим образом:Как
reified
работаетВы можете использовать только
reified
в сочетании сinline
функцией . Такая функция заставляет компилятор копировать байт-код функции в каждое место, где используется функция (функция «встроена»). Когда вы вызываете встроенную функцию с типом reified, компилятор знает фактический тип, используемый в качестве аргумента типа, и модифицирует сгенерированный байт-код для непосредственного использования соответствующего класса. Поэтому вызовы likemyVar is T
становятсяmyVar is String
(если аргумент типа былString
) в байт-коде и во время выполнения.пример
Давайте посмотрим на пример, который показывает, насколько полезным
reified
может быть. Мы хотим создать функцию расширения дляString
вызываемого,toKotlinObject
которая пытается преобразовать строку JSON в простой объект Kotlin с типом, указанным универсальным типом функцииT
. Мы можем использоватьcom.fasterxml.jackson.module.kotlin
для этого, и первый подход заключается в следующем:а) первый подход без ограниченного типа
readValue
Метод принимает тип , который он , как предполагается разобратьJsonObject
к. Если мы пытаемся получитьClass
параметр типаT
, компилятор жалуется: «Невозможно использовать« T »в качестве параметра типа reified. Вместо этого используйте класс».б) Обходной путь с явным
Class
параметромЧтобы обойти эту проблему, то
Class
изT
может быть сделан параметр метода, который затем используется в качестве аргументаreadValue
. Это работает и является общим шаблоном в общем коде Java. Это можно назвать следующим образом:в) путь Котлина:
reified
Использование
inline
функции сreified
параметром типаT
позволяет реализовать функцию по-разному:Там нет необходимости брать
Class
изT
дополнительно,T
может быть использован , как если бы это был обычный класс. Для клиента код выглядит так:Важное примечание: работа с Java
Встроенная функция с
reified
типом не вызывается из кода Java .источник
ПРОСТО
* reified - это разрешение на использование во время компиляции (для доступа к T внутри функции de)
например:
используя как:
источник