Kotlin 确定具体化类型是否可为空

Kotlin 确定具体化类型是否可为空,kotlin,Kotlin,假设我有一个需要类类型和布尔值的委托类。如果此委托用于的属性类型可为null,我会考虑特定的功能。为了简单起见,假设它根据布尔参数为null抛出一个错误 class Sample<T: Any> (val type: KClass<T>, val allowNulls: Boolean){ private var value: T? operator fun getValue(thisRef: Any, pro

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

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
    }
}
类示例(val类型:KClass、,
val allowNulls:布尔值){
私有var值:T?
运算符fun getValue(thisRef:Any,property:KProperty):T{
如果返回(allowNulls)
价值
其他的
值?:抛出异常(“值为null!”)
}
运算符fun setValue(thisRef:Any,属性:KProperty,值:T?){
this.value=value
}
}
我想创建一个具体化的函数,以便轻松生成此类的实例,自动确定该类型是否应为null。同样,这对于行为与可为null的属性不同的委托非常有用。例如,根据委托属性是否可为空,这将用于允许不同的行为:

val nullableString by sample<String?>()
val nonnullString by sample<String>()
val nullableString2: String? by sample()
val nonnullString2: String by sample()
val nullableString by sample()
示例()中的val nonnullString
val nullableString2:字符串?按样本()
val nonnullString2:String by sample()
如何确定具体化类型是否可为空?我看不到访问此信息的方法:

inline fun <reified T: Any> sample(): Sample<T>{
    return Sample(T::class, /** T is nullable */)
}
inline fun sample():sample{
返回样本(T::class,/**T可为空*/)
}

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

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

然而,在您的示例中,
T
任何
上限,因此表达式将始终为false。

对此有一个非常简单的答案!但首先:

请记住,Kotlin中的顶部类型是
Any?
(可为空)。不可为空的
Any
是一个子类型,所有不可为空的类型都是从该子类型派生而来。因此,如果类型不是
Any
的子类型,则该类型可为空

因此,您的泛型
已经限制为不可为空的类型,而您的函数只能使用
false

但是,如果您放宽该限制,测试将变为仅
null is T
——毕竟,如果类型包含
null
作为值,则该类型是可为null的:

inline fun <reified T: Any?> sample(): Sample<T> {
    return Sample(T::class, null is T)
}
inline fun sample():sample{
返回样本(T::class,null为T)
}

谢谢。很抱歉,你被挤出了5秒钟。如果两个答案在实用性上是相等的,我该怎么办?我不能说:-),但答案很少完全相等。我建议尝试确定一个最有可能对你和未来任何人有用的问题。(如果那不是我的,我可能会挺过失望!)