有一个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替换属性,但我不会建议,因为你必须用getNumbsetNum来访问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

从技术上来说,这是一个你要找的东西的功能要求 ,但是它已经过了几年了。