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