kotlin反射检查可空类型

我怎样才能测试一个KType变量是否包含一个可为空的kotlin类型的值(eG 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?") 

One Solution collect form web for “kotlin反射检查可空类型”

正如您从KType API文档中看到的那样,它的界面还远远没有完成。 目前几乎对于任何操作,您都必须使用Java反射,并使用.javaType实例上提供的.javaType扩展属性。 (顺便说一下,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 
  • Kotlin - 安全呼叫运营商的链接。 不必要的话务员
  • 在Kotlin项目中使用的传统Java库中保持零安全
  • 如何在Android Activity上使用Kotlin扩展函数进行空检查
  • 如何使用自定义的类对象在android中的onCreate()中使用正确实现lateinit避免“属性获取或设置器预期”错误
  • kotlin反布尔安全铸造
  • Java to Kotlin转换器和可空方法参数
  • 智能投射到kotlin.String
  • Kotlin如果不是空的
  • 如果对象为空,如何运行代码?
  • Kotlin Null安全警告意外令牌(使用;在同一行上分隔expression式)
  • Kotlin可为空的变量赋值
  • Kotlin language will be the best programming language for Android.