不一致的空相等检查scala 2.11.7
编辑:Scala 2.12.6中不再存在此问题不一致的空相等检查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.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)。