7

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

我有

var type: KType 

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

when (type) {
    Int::class.defaultType -> ...
    Long::class.defaultType -> ...
    else -> ...
}

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

type.toString().equals("kotlin.Int?")
4

1 回答 1

7

KType API 文档中可以看出,它的接口还远远不够完善。目前,几乎所有操作都必须借助 Java 反射以及实例.javaType上可用的扩展属性。KType(顺便说一句,这肯定会在 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
于 2016-03-11T17:57:06.037 回答