kotlin отражение проверить nullable типы

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

я имею

var type: KType 

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

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

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

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

1 ответ

Решение

Как видно из документации по API KType, его интерфейс далек от завершения. В настоящее время практически для любой операции приходится прибегать к отражению Java с помощью .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
Другие вопросы по тегам