Отливка отражения "Тип" в Список <class>в Котлине - PullRequest
0 голосов
/ 28 мая 2019

В моем коде Kotlin у меня есть переменная, которая является интерфейсом типа из java.lang.reflect

var type: Type

Но мне нужно привести это к:

List<UserInfo>

ЕслиЯ не был кастом в Список, я просто сделал бы это:

var type = UserInfo::class.java

, и это работает.Но я не знаю, как разыграть его, используя Список.Самое близкое, что я нашел, это:

var type = Array<UserInfo>::class.java

Это скомпилировалось бы, если бы мой UserInfo был массивом, но это список.

1 Ответ

0 голосов
/ 28 мая 2019

Проблема (как говорит @ Miha_x64): type erasure .

Виртуальная машина Java ничего не знает о параметрах типа. Таким образом, хотя источник указал List<UserInfo>, он компилируется в простой List.

Так что это работает:

var type = List::class.java

(Ваш пример Array работает, потому что массивы - это особый случай: они напрямую поддерживаются в JVM и сохраняют свои типы во время выполнения.)

Java использует стирание типов по крайней мере частично по историческим причинам; Когда дженерики были добавлены в Java 5, они хотели сохранить совместимость с существующим исходным кодом и байт-кодом. Для всех кровавых деталей (большая часть которых унаследована Kotlin), см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...