2013-10-12 5 views
9

オブジェクトの"public final Class<?> getClass()"メソッドのドキュメントは言う:「getClass()」ドキュメントで「静的型の式が消去された」とはどういう意味ですか?

実際の結果型がクラス<のですか?拡張| X | >ここで、| X | getClassが呼び出される式の静的型を で消して、 を呼び出します。たとえば、このコードの部分にキャストは必要ありません。

私は説明を理解できません。特に| X | 「getClassが呼び出される静的型の式の消去」と言われています。

どのような表記法が| X | ?あるいは、他にどこに| X |型表記を使用するか? (type erasureを参照)testの静的な型(the expression on which getClass() is called)は消去がListでのList<Integer>ある

List<Integer> test = new ArrayList<Integer>(); 
Class<? extends List> clazz = test.getClass(); 

+3

'| X |'という表記は、java構文の外で_meta-variable_、プレースホルダとして使用されていました。数学ではおそらくギリシャ語の手紙を使うでしょう。 –

答えて

6

Java言語仕様mandates

オブジェクトのクラスを表すClassオブジェクトを返すgetClass方法。

Classオブジェクトは、参照タイプごとに存在します。たとえば、クラス、そのメンバー、直接のスーパークラス、およびそれが実装するすべてのインターフェイスの完全修飾名を検出するために使用できます。

getClassのメソッド呼び出し式のタイプはClass<? extends |T|>です。ここで、TはgetClassで検索されるクラスまたはインターフェイス(§15.12.1)です。

したがって、getClassの戻り型は、式getClass()が呼び出された静的(コンパイル時)型です。例えば、次のよう

String s = ""; 
Object o = s; 
Class<? extends String> sc = s.getClass(); // ok 
Class<? extends Object> oc = o.getClass(); // ok 
oc = sc; // ok 
sc = o.getClass(); // not ok 
sc = oc; // not ok 

表記|X|はスペックにdefinedある:

タイプの消去は、パラメータのタイプ決してしないことタイプに(おそらくパラメータ化された型と型変数を含む)の種類からのマッピング(ありますまたは型変数)。タイプTの消去の場合は|T|と記載しています。次のように消去マッピングが定義される:

  • パラメータ化された型(§4.5)G<T1,...,Tn>の消去が|G|あります。

  • 入れ子タイプT.Cの消去は、|T|.Cです。

  • アレイタイプT[]の消去は|T|[]です。

  • タイプ変数(§4.4)の消去は、その左端の境界の消去です。

  • 他のすべてのタイプの消去はタイプそのものです。例えば

我々が持っている場合は、:

List<String> list = ...;  

を表現list.getClass()はタイプClass<? extends List>いうよりClass<? extends List<String>>です。

7

はのは、次の例を考えてみましょう。 testの動的(または実行時)タイプはArrayListであり、ランタイムタイプはclazzであり、Class<ArrayList>となることに注意してください。

したがって、Class<? extends |X|>Class<? extends List>です。この方法は、コンパイラによって特別な方法で処理されていることを

+0

完璧な例、ありがとう。 –

関連する問題