2011-11-27 52 views
12

因爲內部「不符合」 AnyRef,我不知道爲什麼它不會在6.3節根據Scala Reference拋出NullPointerException:爲什麼不null.asInstanceOf [Int]拋出一個NullPointerException?

asInstanceOf [T]返回如果「空」的對象本身牛逼符合 scala.AnyRef,並拋出一個NullPointerException否則

而且也沒有null.asInstanceOf[Double]null.asInstanceOf[Boolean]null.asInstanceOf[Char]

PS:我的Scala庫是2.9.0.1版本和操作系統windows XP

+0

我必須同意你,規範似乎很清楚。它應該拋出一個'NullPointerException'或規格應該更新。 – huynhjl

+5

https://issues.scala-lang.org/browse/SI-5236 – huynhjl

+0

不是你的問題的激情,但你可以在使用對象時使用類型賦值:'val x = null:String'或'null: java.lang.Boolean'。 – paradigmatic

回答

5

在斯卡拉Null是一種類型,它有一個值null。由於null是一個值,Scala中的每個值都是一個對象,所以可以調用它的方法。

+1

恐怕我不能同意你的看法。正如Scala引用所述, 對「null」對象的任何其他成員的引用會導致引發 NullPointerException –

+3

這正是發生的情況。例如'null.toString'會引發一個NullPointerException異常。運行時拋出異常。你不能在Java中這樣做,因爲'null'是一個語言關鍵字,所以它不會被編譯。 – agilesteel

-1

事實上,由於huynhjl在票證中指出language spec的第6.3節,這有點令人驚訝。

,另一方面行爲(null.asInstanceOf[Int]給你0)與下列觀察有些是一致的:當你想擁有「值」

new Array[AnyRef](3) // -> Array(null, null, null) 
new Array[Int ](3) // -> Array(0, 0, 0) 

正因爲如此可在一個通用類有用對於X類型,即使您沒有可用的特定值。正如在第二個觀察:

class X[A] { 
    var value: A = _ 
} 

new X[Int].value // -> 0 (even if X is not specialized in A, hmmm....) 
相關問題