如何测试 KType 变量是否包含可空 kotlin 类型的值(例如 Int?)?
I have
var type: KType
变量来自于KProperty<*>.returnType
我需要检测它是否等于某些 kotlin 类型(Int、Long 等)。这适用于:
when (type) {
Int::class.defaultType -> ...
Long::class.defaultType -> ...
else -> ...
}
但这仅适用于不可空类型,因此第一个分支与 Int 不匹配?但是我还不知道如何检测类型是否为 Int?其他则很明显但不太好
type.toString().equals("kotlin.Int?")
正如你可以看到KTypeAPI文档,其接口还远未完成。目前,几乎任何操作都必须借助 Java 反射.javaType
扩展属性可用于KType
实例。 (顺便说一句,这个问题肯定会在 Kotlin 1.1 中得到解决。)
在您的情况下,您必须检查类型是否可以为 null 并且其 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)