不一致的空等级检查scala 2.11.7

时间:2016-02-23 20:44:09

标签: scala null boxing unboxing

编辑:Scala 2.12.6中不再存在此问题

原始问题(对于Scala 2.11.7):

为什么这么奇怪的警告?

x = " " and y = " "

P.S。 scala> null.asInstanceOf[Double] res0: Double = 0.0 scala> null.asInstanceOf[Double] == null <console>:11: warning: comparing values of types Double and Null using `==' will always yield !!!!false!!!! null.asInstanceOf[Double] == null ^ res1: Boolean = true //!!!! scala> 0.0 == null <console>:11: warning: comparing values of types Double and Null using `==' will always yield false 0.0 == null ^ res2: Boolean = false scala> null.asInstanceOf[Double] == 0.0 res6: Boolean = true scala> val a = null.asInstanceOf[Double] a: Double = 0.0 scala> a == null <console>:12: warning: comparing values of types Double and Null using `==' will always yield false a == null ^ res7: Boolean = false Int

也是如此

P.S.2这不是重复 - 这里的问题是拳击根本不会发生Long(从我的回答中可以看出)+警告信息不一致

2 个答案:

答案 0 :(得分:1)

编辑:Scala 2.12.6中不再存在此issue。请参阅pull-request并附上说明。

原始答案(适用于Scala 2.11.7):

null.asInstanceOf[Double] == null编译为:

aconst_null
ifnonnull

val - 版本编译为:

aconst_null
invokestatic unboxToDouble
putfield
aload_0
invokevirtual а
invokestatic boxToDouble
ifnonnull

因此编译器忘记在第一种情况下添加unbox / box

答案 1 :(得分:-2)

这是因为Java中的scala.Double == double,它不能包含空值。如果您想要所需的行为,可以使用java.lang.Double,这样就可以存储空值。

val n = null.asInstanceOf[java.lang.Double]
println("null? = " + n)
//null? = null

防止使用double的另一种方法是更明确地了解类型

val n: AnyVal = null.asInstanceOf[Double]
println("null? = " + n)
//null? = null

为了让事情更加混乱,试试这个:

println("null? = " + null.asInstanceOf[Double])
//null? = null

这表明只有在为val赋值空值时才会使用double

我对编译器警告没有一个很好的解释,这个警告在这个具体情况下看起来不正确。