繁体   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