如何测试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?")
答案 0 :(得分:6)
从KType API文档中可以看出,它的界面远非完整。目前几乎对于任何操作,您都必须使用a.Out
实例上的.javaType
扩展属性来使用Java反射。 (顺便说一下,这肯定会在Kotlin 1.1中得到解决。)
在您的情况下,您必须检查类型是否可为空且其Java类型是否等于所需基本类的类型,例如:
KType
我还可以提供一个更适合您的用例的有趣解决方法:您可以声明具有所需类型的私有函数,并使用反射来与运行时该函数的返回类型进行比较:
val isNullableInt = type.isMarkedNullable &&
type.javaType == Int::class.defaultType.javaType