10

重複の可能性:
Int を null にできない場合、null.asInstanceOf[Int] はどういう意味ですか?

REPLで次のことを試しました:

scala> null.asInstanceOf[Int]
res12: 整数 = 0

scala> null.asInstanceOf[Float]
res13: フロート = 0.0

scala> null.asInstanceOf[Double]
res14: ダブル = 0.0

NPEその場合、実行時例外 (または)が予想されますClassCastException。Scalaがゼロにキャストする理由
を 誰か説明できますか?null

4

3 に答える 3

6

仕様に従って期待される動作ではないため、これは本当に奇妙です。

asInstanceOf[T]に適合する null場合はオブジェクト自体を返し、そうでない場合は をスローします。Tscala.AnyRefNullPointerException

-- Scala 言語仕様、バージョン 2.9、p. 75。

そして、これは既知のバグであり、クローズされていますが、オープンであるこのバグに関連しています。

于 2012-07-05T06:49:05.440 に答える
3

その理由はnull、参照型のキャストが常に別の参照型に変換されるためです。この場合は、 or のボックス化されたバージョンIntですDouble

次のステップで、コンパイラはボックス化されたオブジェクトをプリミティブ値に変換します。ボックス化されたIntオブジェクトがの場合null、対応するデフォルトのプリミティブ値は0です。

参照: Int を null にできない場合、null.asInstanceOf[Int] はどういう意味ですか?

于 2012-07-05T11:11:00.833 に答える
1

これらの型はすべて AnyVal を拡張します。代入によって値を null にすることはできませんが、asInstanceOf に応答して値をゼロにする理由はわかりません。REPL でのみこれを行っているように見えますが、これは少し特殊なケースです。実際のコードでは null を返します。

于 2012-07-05T06:51:19.257 に答える