编辑: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
(从我的回答中可以看出)+警告信息不一致
答案 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
。
我对编译器警告没有一个很好的解释,这个警告在这个具体情况下看起来不正确。