即使背景字段可以为空也让吸气剂返回不可空的类型
问题描述:
num
设置时应该是可以为空的,但它返回的内容应始终为非空(具有默认值)。即使背景字段可以为空也让吸气剂返回不可空的类型
class Test {
var num: Int? = null
get() = field ?: 5 // default value if null
}
虽然返回的值始终不为空的对我来说很有意义以下甚至不进行编译,因为该类型不是推断,但是从支持字段采取:
val a: Int = Test().num
类型不匹配:推断的类型是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
。
从技术角度而言,feature request是您正在寻找的产品,但已经过了多年。
+0
中支持属性的示例。 –
既然您知道这是安全的,您可以在技术上使用'.num !!'。这并不好,但在这种情况下它仍然安全。 – chris
您的支持属性解决方案绝对是正确的,它甚至是用于查找功能请求+1的文档https://kotlinlang.org/docs/reference/properties.html#backing-properties – zsmb13