kotlin reflection check nullable types

三世轮回 提交于 2019-12-01 04:45:41

问题


How can I test if a KType variable holds a value of a nullable kotlin type, (e.G. Int?)?

I have

var type: KType 

variable coming from a KProperty<*>.returnType and I need to detect if it is equal to certain kotlin types (Int, Long, etc). This works with:

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

but this only works for non-nullable types, so the first branch does not match to Int? However I was yet unable to figure out how I could detect is type is Int? other then to obvious but not so nice

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

回答1:


As you can see from the KType API documentation, its interface is far from complete. Currently almost for any operation you have to resort to Java reflection with the .javaType extension property available on KType instances. (By the way, this is surely going to be addressed in Kotlin 1.1.)

In your case, you have to check if the type is nullable and its Java type is equal to that of the required primitive class, e.g.:

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

I can also present a funny workaround which may be more suitable for your use case: you can declare a private function with the needed type and use reflection to compare against the return type of that function at runtime:

// Only return type of this function is used
fun _nullableInt(): Int? =
    TODO()  // Doesn't matter, it never gets called

...

val isNullableInt = type == ::_nullableInt.returnType


来源:https://stackoverflow.com/questions/35946044/kotlin-reflection-check-nullable-types

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!