kotlin反射检查可空类型

Laj*_*thy 5 reflection nullable kotlin kotlin-null-safety

如何测试KType变量是否包含可为空的kotlin类型的值(eG Int?)?

我有

var type: KType 
Run Code Online (Sandbox Code Playgroud)

变量来自a KProperty<*>.returnType,我需要检测它是否等于某些kotlin类型(Int,Long等).这适用于:

when (type) {
    Int::class.defaultType -> ...
    Long::class.defaultType -> ...
    else -> ...
}
Run Code Online (Sandbox Code Playgroud)

但这仅适用于非可空类型,因此第一个分支与Int不匹配?但是我还是无法弄清楚我是如何检测到的类型是Int?除了明显但不那么好

type.toString().equals("kotlin.Int?")
Run Code Online (Sandbox Code Playgroud)

Ale*_*lov 6

KType API文档中可以看出,它的界面远非完整.目前几乎对于任何操作,您都必须.javaType使用KType实例上具有扩展属性的Java反射.(顺便说一下,这肯定会在Kotlin 1.1中得到解决.)

在您的情况下,您必须检查类型是否可为空且其Java类型是否等于所需基本类的类型,例如:

val isNullableInt = type.isMarkedNullable &&
                    type.javaType == Int::class.defaultType.javaType
Run Code Online (Sandbox Code Playgroud)

我还可以提供一个有趣的解决方法,它可能更适合您的用例:您可以声明具有所需类型的私有函数,并使用反射在运行时与该函数的返回类型进行比较:

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

...

val isNullableInt = type == ::_nullableInt.returnType
Run Code Online (Sandbox Code Playgroud)