2011-11-27 9 views
12

INTはAnyRef「に適合していない」ので、私はなぜそれが6.3節にScala Referenceに応じNullPointerExceptionがスローされませんことを確認していない:T場合null.asInstanceOf [Int]がNullPointerExceptionをスローしないのはなぜですか?

asInstanceOf [T]は「ヌル」オブジェクトそのものを返します scala.AnyRefに準拠していない、と

そうでない場合はNullPointerExceptionをスローし、どちらもnull.asInstanceOf[Double]null.asInstanceOf[Boolean]null.asInstanceOf[Char]を行います。

PS:私のScalaのライブラリはバージョン2.9.0.1であり、ScalaのNullでOSのWindows XP

+0

私はあなたに同意する必要があります、仕様はかなり明確に思われる。 'NullPointerException'をスローするか、仕様を更新する必要があります。 – huynhjl

+5

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

+0

あなたの質問には答えられませんが、オブジェクトを使用するときには代わりにtype ascriptionを使用できます: 'val x = null:String'または' null: java.lang.Boolean'を返します。 – paradigmatic

答えて

5

は、単一の値nullを持っているタイプです。 nullは値で、Scalaのすべての値はオブジェクトなので、その上でメソッドを呼び出すことができます。

+1

私はあなたに同意できないのでしょうか?スカラーリファレンスが示すように、 "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のために。第2の観察のように:

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

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