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?") 

正如您从KType API文档中看到的那样,它的界面还远远没有完成。 目前几乎对于任何操作,您都必须使用Java反射,并使用.javaType实例上提供的.javaType扩展属性。 (顺便说一下,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