Javaの場合、私が書いた場合:
System.out.println((String) null);
、私は"null"
を得ます。Javaがnull参照をString "null"にキャストするのはなぜですか?
これは奇妙なようです。デザイナーがこのアプローチを選んだ理由を知っている人はいますか?これは、「何もないものを創造する」ケースであると私は思う。私はJLS entry on cast operatorsを読んで、それは言う:
キャスト式のタイプは、名前が括弧内に表示されるタイプにキャプチャ変換(§5.1.10)を適用した結果です。
キャスト式の結果は、変数ではなく、オペランド式の結果が変数であっても値です。 entry on capture conversionへジャンプ
、私は一般的なタイプのために定義されたキャプチャの変換を参照してください、しかし、エントリが追加されます:パラメータ化された型以外の任意の型(§4.5)の
キャプチャ変換が恒等変換として機能(5.1.1)。
大丈夫です! entry on identity conversionにあり、これがあります:
どのタイプから同じタイプへの変換も許可されています。この場合
、タイプがString
ですが、変換する事がnull
であり、それは混乱し、私を残しました。しかし、Javaが実際に(String) null
の文字列変換を使用していることが判明しました。 JLS entry on String conversionは言う:
任意のタイプは、参照がnullの場合は...文字列変換によって
を文字列型に変換することができる、それが文字列に変換され、「ヌル」(4つのASCII文字N、U、 l、l)。HashMap map = new HashMap(); System.out.println((String)map.get("something"));
プログラムプリント
"null"
:これが提起
一つの問題は、このです。エントリがnull
でHashMapの文字列がnull(4つのASCII文字 'n'、 'u'、 'l'、 'l')であるため、今では、誰かが、Javaがraw typesの使用を失望させ、タイプHashMap
をパラメータ化する必要があると言うでしょうが、それは解決策ですか?
代わりに何をすると思われますか? –
おそらく 'NullPointerException'をスローする – Nayuki
誰もが' System.out.println'を使ってデバッグしようとしています。デバッグに使用される主要なツールが例外を投げた場合、それはうまくいかないでしょう。実用的なものをあまり驚くべきものにするのは実用的な選択であり、完全に論理的なものではありません。 –