[英]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.