[英]Parquet file not keeping non-nullability aspect of schema when read into Spark 3.3.0
[英]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
分配為true
( x != 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.