2017-10-06 66 views
3

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

回答

5

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 
} 
3

我不認爲這是可能的Kotlin。您無法覆蓋get/set屬性的類型。因此,如果您的財產是Int?,您將不得不返回Int?,並在使用它時檢查它是否爲null

從技術角度而言,feature request是您正在尋找的產品,但已經過了多年。

+0

中支持屬性的示例。 –