不一致的空等级检查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
附:同样适用于Int
和Long
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代码片段?