有一个getter返回一个不可为空的类型,即使后台字段是可空的
num
在设置时应该是可以为空的,但是它返回的值应该总是不可空的(有一个默认值)。
class Test { var num: Int? = null get() = field ?: 5 // default value if null }
即使返回的值总是非空,这对我来说是合理的,因为这种类型不是推断出来的,而是从后台字段中得到的:
val a: Int = Test().num
类型不匹配:推断类型是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
。
从技术上来说,这是一个你要找的东西的功能要求 ,但是它已经过了几年了。