Как получить общий класс param в Котлине?

Мне нужно иметь возможность рассказать общий тип коллекции котлин во время выполнения. Как мне это сделать?

val list1 = listOf("my", "list") val list2 = listOf(1, 2, 3) val list3 = listOf<Double>() /* ... */ when(list.genericType()) { is String -> handleString(list) is Int -> handleInt(list) is Double -> handleDouble(list) } 

Генераторы Kotlin используют характер Java для стирания во время компиляции, поэтому во время выполнения эти списки больше не содержат необходимую информацию, чтобы делать то, что вы просите. Исключением является то, что вы пишете встроенную функцию, используя типы reified. Например, это будет работать:

 inline fun <reified T> handleList(l: List<T>) { when (T::class) { Int::class -> handleInt(l) Double::class -> handleDouble(l) String::class -> handleString(l) } } fun main() { handleList(mutableListOf(1,2,3)) } 

Однако встроенные функции расширяются на каждом сайте вызова, и беспорядок с вашими трассировками стека, поэтому вы должны использовать их экономно.

Однако в зависимости от того, что вы пытаетесь достичь, есть несколько альтернатив. Вы можете добиться чего-то подобного на уровне элемента с закрытыми классами:

 sealed class ElementType { class DoubleElement(val x: Double) : ElementType() class StringElement(val s: String) : ElementType() class IntElement(val i: Int) : ElementType() } fun handleList(l: List<ElementType>) { l.forEach { when (it) { is ElementType.DoubleElement -> handleDouble(it.x) is ElementType.StringElement -> handleString(it.s) is ElementType.IntElement -> handleInt(it.i) } } } 

Вы можете использовать inline функции с параметрами типа reified для этого:

 inline fun <reified T : Any> classOfList(list: List<T>) = T::class 

(runnable demo, в том числе, как проверить тип в выражении when )

Это решение ограничено случаями, когда фактический аргумент типа для T известен во время компиляции, потому что inline функции преобразуются во время компиляции, а компилятор заменяет свои параметры типа reified на реальный тип на каждом сайте вызова.

В JVM аргументы типа общих классов стираются во время выполнения, и в основном нет способа получить их из произвольного List<T> (например, список, переданный в не-встроенную функцию, поскольку List<T>T is не известно во время компиляции для каждого вызова и удаляется во время выполнения)

Если вам нужно больше контролировать параметр типа reified внутри функции, вы можете найти это Q & A полезным.

Intereting Posts
Дополнительные наблюдаемые данные в combLatest Как использовать Kotlin, когда найти, является ли строка числовой? Потрясающее поведение Firebase. Прекращение доступа к сети java.lang.IllegalStateException: архивы Dex: установка расширения .DEX только для файлов .CLASS Типы подстановок Java против звездной проекции Котлина Kotlin: Как проверить, содержит ли перечисление заданную Строку, не входя в Исключения? Почему Kotlin необходимо связать свою рабочую среду после компиляции? Java -> Преобразование Kotlin с необработанными типами Скрипт Kotlin не может получить доступ к ресурсам META-INF (persistence.xml) из jar Как изменить правила подсветки синтаксиса для переменной с модификатором lateinit в IntelliJ (Kotlin)? Kotlin: Создайте и передайте истинные массивы Java (для JNA) Создание исполняемой толстой баночки с град-скрипт-котлин ExpandableListView не отображается в моей деятельности Инициализация массива Kotlin 2d Как сделать класс данных в Kotlin неизменным с java Date объектом в нем?