[英]Having a getter return a non-nullable type even though the backing field is nullable
num
设置时应该可以为空,但它返回的内容应该始终不可为空(具有默认值)。
class Test {
var num: Int? = null
get() = field ?: 5 // default value if null
}
即使返回值始终为非空,以下内容也不会编译,这对我来说很有意义,因为类型不是推断出来的,而是从支持字段中获取的:
val a: Int = Test().num
类型不匹配:推断的类型是 Int? 但 Int 是预期的
问题是如何将该 getter 的返回类型更改为不可为空? 如果我这样做,编译器会说:
Getter 返回类型必须等于属性的类型,即“Int?”
我知道我可以用另一个属性numNotNullable
(没有支持字段)来解决它。
class Test {
var num: Int? = null
get() = field ?: 5 // default value if null
val numNotNullable: Int
get() = num ?: 5
}
val c: Int = Test().numNotNullable
但这不是我想要的。 还有其他方法吗?
var num: Int? = null
这是您的财产签名。 如果您在内部确保不返回null
值,则无关紧要。 签名说,该值可以为空。
这意味着:
null
设置为此字段 null
的事实 第二个属性的解决方案很好。
你当然可以用普通的旧java bean替换属性,但我不建议这样做,因为你必须使用getNumb
和setNum
访问prop。
class Test {
private var num: Int = 5
fun setNum(num: Int?) {
this.num = num ?: 5
}
fun getNum() = num
}
我不相信在Kotlin这是可能的。 您不能覆盖get / set属性的类型。 那么,如果您的房产是Int?
你将不得不返回一个Int?
并在使用它时检查它是否为null
。
从技术上讲,这是一项针对您所寻找的功能的要求 ,但它已经创建了多年。
您可以使用委托属性实现此目的
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class LazyVar<T : Any>(private var initializer: () -> T) : ReadWriteProperty<Any?, T> {
private var value: T? = null
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
if (value == null) {
value = initializer()
print(value)
}
return value as T
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
this.value = value
}
}
class Test {
var num: Int by LazyVar { 5 }
}
val a: Int = Test().num
请注意,此代码不是线程安全的。 同样使用此代码示例,您无法为您的字段设置空值(因此无法返回默认值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.