最初の呼び出しは、ArrayList<Integer>
の匿名サブクラスのインスタンスを渡しています。だから、それはに似ています:
class YourClass extends ArrayList<Integer>
、あなたのようにメソッドを呼び出す:
printType(new YourClass());
あなたのケースでYourClass
の汎用的なスーパークラスまたは匿名クラスをArrayList<Integer>
だけです。したがって、その出力は明らかです。
2番目のケースでは、ArrayList<Integer>
というインスタンスを渡しています。このクラスの定義がどのように見えると:
だから、
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
、ここでは一般的なスーパークラスはAbstractList<E>
です。ジェネリック型を共有し、同じClass
インスタンスの
インスタンス化:ArrayList
のすべてのインスタンスが実行時に同じクラスを共有することが
注:
new ArrayList<Integer>().getClass() == new ArrayList<String>().getClass();
上記の比較はあなたにtrue
を与えるだろう。 getClass()
呼び出しの両方があなたに戻って与えるので:
class java.util.ArrayList
はJLS 8.1.2: Generic Classes and Type Parametersを参照してください:
ジェネリッククラス宣言は、パラメータ化された型 (§4.5)のセットを定義し、タイプの可能な各呼び出しのための1型引数別のパラメータセクション これらのパラメータ化された型はすべて、実行時に同じ クラスを共有します。例えば
、コードを実行する:
Vector<String> x = new Vector<String>();
Vector<Integer> y = new Vector<Integer>();
boolean b = x.getClass() == y.getClass();
値true
を保持する変数b
をもたらすであろう。言い換えれば
、getGenericSuperClass()
方法は、あなたのクラスをインスタンス化しながら、実際に使用する型引数が、それが拡張され、クラスで使用されるタイプのパラメータを与えることはありません。今、java.util.ArrayList
の汎用スーパークラスはAbstractList<E>
です。したがって、取得するタイプパラメータはE
のみになります。
あなたは何をしようとしていますか? –
あなたのリストの型パラメータを印刷しています –
実行時に型のパラメータを取得しようとしています –