проверка отражения kotlin с нулевыми типами

Как проверить, имеет ли переменная KType значение нулевого типа kotlin, (eG Int?)?

у меня есть

var type: KType 

переменная, исходящая из KProperty<*>.returnType и мне нужно определить, соответствует ли она определенным типам kotlin (Int, Long и т. д.). Это работает с:

 when (type) { Int::class.defaultType -> ... Long::class.defaultType -> ... else -> ... } 

но это работает только для непустых типов, поэтому первая ветвь не соответствует Int? Однако я еще не смог понять, как я могу определить, является ли тип Int? другие тогда к очевидным, но не очень приятным

 type.toString().equals("kotlin.Int?") 

Как видно из документации API KType , ее интерфейс далек от завершения. В настоящее время почти для любой операции вам приходится прибегать к отражению Java с использованием .javaType расширения. .javaType доступного в экземплярах KType . (Кстати, это, безусловно, будет рассмотрено в Kotlin 1.1.)

В вашем случае вам нужно проверить, является ли тип нулевым, а его тип Java равен значению требуемого примитивного класса, например:

 val isNullableInt = type.isMarkedNullable && type.javaType == Int::class.defaultType.javaType 

Я также могу представить забавное обходное решение, которое может быть более подходящим для вашего случая использования: вы можете объявить частную функцию с нужным типом и использовать отражение для сравнения с типом возвращаемости этой функции во время выполнения:

 // Only return type of this function is used fun _nullableInt(): Int? = TODO() // Doesn't matter, it never gets called ... val isNullableInt = type == ::_nullableInt.returnType 
  • Различные вопросы @NonNull, @NotNull и @ParametersAreNonnullByDefault
  • Почему mutableMapOf возвращает значение NULL?
  • Может ли Kotlin испускать аннотации JSR-305 в файлах классов
  • В Kotlin, как я идиоматически обращаюсь к значениям вложенной карты с нулевым значением или возвращать значение по умолчанию?
  • Наличие getter возвращает тип с нулевым значением, даже если поле поддержки является нулевым
  • Предоставить Kotlin предупреждение о назначении гибкого / платформенного типа для непустого типа?
  • Несоответствие типа Котлина с дженериками
  • Почему тип NULL + null неявно String в Kotlin?
  • Давайте будем гением компьютера.