Kotlin 确定具体化类型是否可为空
假设我有一个需要类类型和布尔值的委托类。如果此委托用于的属性类型可为null,我会考虑特定的功能。为了简单起见,假设它根据布尔参数为null抛出一个错误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
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秒钟。如果两个答案在实用性上是相等的,我该怎么办?我不能说:-),但答案很少完全相等。我建议尝试确定一个最有可能对你和未来任何人有用的问题。(如果那不是我的,我可能会挺过失望!)