不一致的空等级检查scala 2.11.7

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不一致的空等级检查scala 2.11.7相关的知识,希望对你有一定的参考价值。

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


原始问题(对于Scala 2.11.7):

为什么这么奇怪警告?

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

附:同样适用于IntLong

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

答案

编辑: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

另一答案

这是因为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

这表明只有在将null值赋给val时才会使用double

我对编译器警告没有很好的解释,这个警告似乎不正确就是这个特定的场景。

以上是关于不一致的空等级检查scala 2.11.7的主要内容,如果未能解决你的问题,请参考以下文章

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

setText时的空指针异常 - TextView [复制]

用Scala中的Option包装Java中的空返回方法?

片段中的 EditText 上的空指针异常 [重复]

docker中spark+scala安装配置

片段中的空指针异常