即使背景字段可以为空也让吸气剂返回不可空的类型

问题描述:

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 

但这不是我想要的。 还有别的办法吗?

+0

既然您知道这是安全的,您可以在技术上使用'.num !!'。这并不好,但在这种情况下它仍然安全。 – chris

+0

您的支持属性解决方案绝对是正确的,它甚至是用于查找功能请求+1的文档https://kotlinlang.org/docs/reference/properties.html#backing-properties – zsmb13

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

从技术角度而言,feature request是您正在寻找的产品,但已经过了多年。

+0

中支持属性的示例。 –