不一致的空等级检查scala 2.11.7

问题描述 投票:3回答:2

编辑: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 null boxing unboxing
2个回答
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


-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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.