2016-04-14 15 views
0

私は次のことを試してみました:`int.class.cast(null)`が動作する理由は何ですか?

System.out.println(int.class.cast(null)); 

これは、それがその仕様に言うまさに行います

は、この{@codeクラス}オブジェクトで を表すクラスまたはインタフェースにオブジェクトをキャスト。
鋳造後のオブジェクト@return
をキャストするオブジェクトOBJ @param、またはnull objがnull
@throwsのClassCastExceptionがある場合、オブジェクトがnull でなく、型T

に割り当てられない場合

Classが非プリミティブなクラスの場合は直感的ですが、nullは結局すべてのクラスに変換可能です。intなどのプリミティブクラスの場合、ClassCastExceptionという結果にはならないのはなぜかと思います。それはInteger、参照型へのキャストと同じですので、私の推論は、int.classのタイプはClass<Integer>ある

Foo f = (Foo) null; // Okay 
int a = (int) null; // Not okay: "Cannot cast from null to int" 
        // why doesn't Class#cast reflect this? 
+3

*これは仕様書に記載されているとおりです*しかし、なぜ仕様書に記載されていないのでしょうか? –

+0

私は最初に仕様書を読まずに試してみたので、尋ねられました、オフガードを捕まえて、それを読んで、それでもそれが不満であると感じました。私は、メソッドの使い方が設計上直感的でなければならないと思っていました。おそらく、私がJavaについて何かを学ぶことができない理由を逃したかもしれません。 – WorldSEnder

+0

基本的にプリミティブ型*はオブジェクトではありません。その決定にはトレードオフがあり、これもその1つです。 –

答えて

3

だろうClass Literals

pがプリミティブ型(§4.2)の名前であるp.classの種類は、Bボクシング変換後のタイプpの式の型であるClass<B>ある(§5.1.7) 。

+0

'int.class'が' Integer.class'と同じように動作しなければならないことは事実ではなく、実際にはそうではありません。 int.class.getField( "MIN_VALUE") 'vs' Integer.class.getField( "MIN_VALUE") ' – WorldSEnder

+0

@WorldSEnderこれらは同じ振る舞いはしませんが、同じ型です。 – manouti

関連する問題