2016-02-23 62 views
3

爲什麼這麼奇怪的警告?不一致的空等式檢查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 

P.S.同爲IntLong

PS2這不是一個重複的 - 這裏的問題是,拳擊不會發生根本不管asInstanceOf(你可以從我的回答看)+警告信息不一致

+3

HTTP:/ /stackoverflow.com/questions/10749010/if-an-int-cant-be-null-what-does-null-asinstanceofint-mean –

+0

雖然我無法找到規範中明確表示同意的任何內容回答。 –

回答

1

null.asInstanceOf[Double] == null編譯到:

aconst_null 
ifnonnull 

val - 版本編譯於:

aconst_null 
invokestatic unboxToDouble 
putfield 
aload_0 
invokevirtual а 
invokestatic boxToDouble 
ifnonnull 

所以編譯器只是忘了添加拆箱/箱在第一種情況下

-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 

這說明使用double只會在您的空值分配給val時發生。

我對編譯器警告沒有很好的解釋,這個警告似乎不正確的是這個特定的場景。