不一致的空相等检查scala 2.11.7

不一致的空相等检查scala 2.11.7,scala,null,boxing,unboxing,Scala,Null,Boxing,Unboxing,编辑: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 `==' wil

编辑: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
scala>null.asInstanceOf[Double]
res0:Double=0.0
scala>null.asInstanceOf[Double]==null
:11:警告:比较类型的值
使用“==”的Double和Null将始终产生!!!!假!!!!
null.asInstanceOf[Double]==null
^
res1:Boolean=true/!!!!
scala>0.0==null
:11:警告:使用“==”比较Double和Null类型的值将始终产生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
:12:警告:使用“==”比较Double和Null类型的值将始终产生false
a==null
^
res7:Boolean=false
p.S.
Int
Long


p.S.2它不是重复的-这里的问题是,无论是
asInstanceOf
(从我的回答中可以看到)+警告消息不一致,装箱都不会发生,这是因为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

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

Edit:Scala 2.12.6中不再存在这个警告。请解释一下


原始答案(针对Scala 2.11.7):

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

aconst_null
ifnonnull
aconst_null
invokestatic unboxToDouble
putfield
aload_0
invokevirtual а
invokestatic boxToDouble
ifnonnull
val
-版本编译为:

aconst_null
ifnonnull
aconst_null
invokestatic unboxToDouble
putfield
aload_0
invokevirtual а
invokestatic boxToDouble
ifnonnull

因此,编译器只是忘记在第一种情况下添加unbox/box,尽管我在规范中找不到任何与答案明确一致的东西。我来自
Java
,最近开始使用
Scala
,所以这条语句
null.asInstanceOf[Double]
对我来说没有任何意义。究竟为什么这不是一个
NullPointerException
?@vishrantidk,让我们假设Java的
Double a=(Double)null
给出了一个
NullPointerException
?:)不,这不是一个NullPointerException,尽管
a
的值将是
null
@Vishrant,Scala中的整个
null
只是为了与Java(以及类似的)互操作,因此有很多bug和不一致性。Scala中推荐的样式是避免总体上为
null
s(通过使用
Option
s包装它们)。它们(悄悄地)装箱/拆箱,以便轻松返回类型的默认值。基本上,缺少它(在某些情况下)与规范本身相矛盾(可能他们已经修复了它,Idk)。