簡體   English   中英

Kotlin的智能投射無法簡單地實現非空性推論

[英]Kotlin's smart cast fails simple non-nullability deduction

試圖了解為什么Kotlin的智能轉換不會觸發一個相當簡單的用例:

val x: Int? = 1

val notNull: Boolean = x != null

if (notNull) {
    val y: Int = x // fails to smart cast
}

但是,如果我們刪除中間val它將起作用:

val x: Int? = 1

if (x != null) {
    val y: Int = x // smart cast works
}

val本質上定義了一個final值,所以我看不出第一個版本不起作用的原因。

出於記錄的目的,Java在此用例上的類似用法( https://github.com/uber/NullAway )也失敗,因此可能存在一些潛在的復雜性,使得這種推論不可能實現?

您必須那樣看。 notNull分配為truex != null的結果)。 在此行之后,沒有可供編譯器在該值與x的可為空性之間建立聯系的信息。

基本上與立即編寫這樣的代碼相同:

val notNull = true // this is all the compiler knows the time it evaluates the if expression.

if (notNull) {
    val y: Int = x // fails to smart cast
}

您可以為

if (x != null) {
    val y: Int = x // smart cast works
}

你會說。 是的,但是在這種情況下,編譯器立即在if塊中提供x作為非空值。 那是畫線的地方。 如果您不停在某個地方,則會導致大量推斷,從而降低了編譯過程的效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM