kotlin - 判断reified类型是否可以为空

标签 kotlin

假设我有一个需要类类型和 bool 值的委托(delegate)类。如果此委托(delegate)用于的属性类型可以为空,我会考虑特定的功能。为了简单起见,假设它应该根据 bool 参数为空值抛出错误。

class Sample<T: Any> (val type: KClass<T>,
                      val allowNulls: Boolean){
    private var value: T?

    operator fun getValue(thisRef: Any, property: KProperty<*>): T? {
        return if (allowNulls)
            value
        else
            value?: throw Exception("Value is null!")
    }

    operator fun setValue(thisRef: Any, property: KProperty<*>, value: T?) {
        this.value = value
    }
}

我想创建一个具体化的函数,以便轻松生成此类的实例,该实例自动确定类型是否应该为空。同样,这对于对可空属性表现不同的委托(delegate)很有用。例如,这将用于根据委托(delegate)属性是否可以为空来允许不同的行为:
val nullableString by sample<String?>()
val nonnullString by sample<String>()
val nullableString2: String? by sample()
val nonnullString2: String by sample()

如何确定具体类型是否可以为空?我看不到访问此信息的方法:
inline fun <reified T: Any> sample(): Sample<T>{
    return Sample(T::class, /** T is nullable */)
}

最佳答案

如果 T是一个具体化的泛型类型参数,您可以通过一个简单但乍一看并不明显的检查来确定它是否可以为空:

if (null is T) { 
   // T is nullable
}

但是在您的示例中 TAny上限,因此表达式将始终为假。

关于kotlin - 判断reified类型是否可以为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58923487/

相关文章:

android - 具有多个不同类型来源的 LiveData

kotlin - Kotlin:表达 “`字符串?` contains `字符串的最佳方法”

android - Kotlin for Android 中匿名类的重写方法

java - 我想要这个..在一帧中对我的多个标记进行 map 缩放。现在我的 map 缩放显示国家/地区的中心位置

android - 由 : rx. 异常引起。MissingBackpressureException

java - 在 map 上创建自定义指南针或移动 native 按钮

kotlin - kotlin 协程是否有带定时器的异步调用?

java - 配置 Gradle 项目以告诉 JAR 在运行时在特定文件夹中查找依赖项工件

android - 是否可以为单个类提供多种委托(delegate)类型?

java - 我可以将 REST 请求转发到其他资源吗?