почему inline fun <reified T> getDataItem()
требуется в *1003*?Если кто-то может дать образец для объяснения reified?
Есть хорошая документация по параметрам reified type , но я постараюсь немного ее свести.
Ключевое слово reified
в Kotlin используется, чтобы обойти тот факт, что JVM использует стирание типа для универсального.Это означает, что во время выполнения всякий раз, когда вы ссылаетесь на универсальный тип, JVM имеет нет представления о том, что представляет собой фактический тип.Это только во время компиляции.Так что T
в вашем примере ... JVM понятия не имеет, что это значит (без формулировки, которую я объясню).
В своем примере вы заметите, что вы также используете inline
ключевое слово.Это говорит Kotlin, что вместо вызова функции при ссылке на нее нужно просто вставить тело функции inline
.Это может быть более эффективным в определенных ситуациях.Итак, если Kotlin уже собирается копировать тело нашей функции во время компиляции, почему бы просто не скопировать класс, который также представляет T
?Здесь используется reified
.Это говорит Kotlin ссылаться на фактический конкретный тип T
и работает только с inline
функциями.
Если вы удалите ключевое слово reified
из вашего примера, вы получите ошибку:Msgstr "Невозможно проверить, например, стёртый тип: T".Реализуя это, Kotlin знает, что такое фактический тип T
, что позволяет нам сделать это сравнение (и полученное умное приведение) безопасно.