Динамический бросок в Котлине

Я хочу KClass<Int> Any в Int с помощью KClass<Int> , имея KClass<Int> и Any который фактически является Int .

 fun <T> cast(any: Any, clazz: KClass<*>): T = clazz.java.cast(any) cast(0, Int::class) 

Однако я получил эту ошибку.

java.lang.ClassCastException: нельзя использовать java.lang.Integer для int

Знаете ли вы какое-либо решение, кроме any as Int ?

Попробуйте изменить свой код на

 fun <T: Any> cast(any: Any, clazz: KClass<out T>): T = clazz.javaObjectType.cast(any) 

объяснение

Поскольку тип параметра any есть Any , он всегда является ссылочным типом, а примитивы будут помещены в бокс. Для второго параметра кажется, что отражение Котлина предпочтет примитивные типы для ссылочных типов, поэтому Int::class.java умолчанию будет иметь значение « ìnt , а не Integer . Используя javaObjectType мы вынуждаем использовать тип ссылочного ссылочного типа.

альтернатива

Вы также можете использовать следующее определение функции:

 inline fun <reified T: Any> cast(any: Any): T = T::class.javaObjectType.cast(any) // usage cast<Int>(0) 
Intereting Posts
Как я получаю HandlerMethod соответствует HttpServletRequest в фильтре Как узнать, пуст ли массив? Неразрешенная ссылка для Кинжала 2 в Котлине java.lang.VerifyError при написании Android-тестов с характеристиками в Котлине java.lang.IllegalStateException: TextView не должен быть нулевым (Android / Kotlin) Может ли перегрузка операторов сравнения в Kotlin использоваться для реализации SQL-подобных функций? Android: Kotlin: пользовательский webView – не может быть вызван как функция. Функция 'invoke ()' не найдена Что сделает HashMap (it)? Поддерживает ли Kotlin Ormlite 100%? (Классы данных) Безусловная инфляция макета из адаптера просмотра. Котлин Разрывы строк в необработанных строках зависят от платформы? Предупреждение: опция '-d' с назначением каталога игнорируется, поскольку указан '-module' Являются ли числовые операции с использованием Kotlin столь же быстрыми, как эквивалент с Java-примитивами? Реализация файла Drag & Drop с помощью LWjGL TornadoFX как добавить проверку при редактировании TableView