kotlin反射检查可空类型

时间:2016-03-11 17:10:08

标签: reflection kotlin nullable kotlin-null-safety

如何测试KType变量是否包含可为空的kotlin类型的值(例如,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?")

1 个答案:

答案 0 :(得分:6)

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

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

KType

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

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