reflection - kotlin 反射检查可空类型

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

最佳答案

正如您从 KType 中看到的那样API 文档,其接口(interface)还远远不够完善。目前几乎对于任何操作,您都必须借助 KType 实例上可用的 .javaType 扩展属性来使用 Java 反射。 (顺便说一句,这肯定会在 Kotlin 1.1 中得到解决。)

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

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

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

// Only return type of this function is used
fun _nullableInt(): Int? =
    TODO()  // Doesn't matter, it never gets called

...

val isNullableInt = type == ::_nullableInt.returnType

关于reflection - kotlin 反射检查可空类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35946044/

相关文章:

c# - 您如何通过 C# 代码处理日期字段中的 NULL?

c# - 无法使用反射获取泛型类型的属性

java - 不使用 getDeclaredMethod 接收 Java 方法

c# - IDictionary<string,object> 上的 Expression.ArrayAccess() 按键名

kotlin - 如何使用 Kotlin Dokka 记录主构造函数参数

java - Kotlin:只有 getter 的私有(private)可变属性

android - 单例-不调用init

kotlin - 有没有办法让函数在从 map 查找时不返回 null

Go lang反射如何识别接口(interface)底层类型

c# - 哪个是首选 : new Nullable<int> or (int? )null?