İlk çağrı, ArrayList<Integer>
numaralı bir anonim alt sınıfın örneğini geçirmektir. Yani, buna benzer:
class YourClass extends ArrayList<Integer>
ve siz yöntemi çağrılırken:
printType(new YourClass());
sizin durumunuzda YourClass
jenerik üst sınıf veya anonim sınıf ArrayList<Integer>
sadece. Yani, bu çıktı açıktır. senin 2 durumda gelince
, sen kendini
ArrayList<Integer>
bir örneğini geçiyoruz.
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Yani, jenerik üst sınıf burada AbstractList<E>
geçerli: gibi Ve bu sınıfın tanımı görünüyor. genel tür payı aynı Class
örneğinin
Örnekleme: ArrayList
tüm instantiation zamanında aynı sınıf paylaştıkları
Not:
new ArrayList<Integer>().getClass() == new ArrayList<String>().getClass();
yukarıdaki karşılaştırma size true
verecektir. Her iki Çünkü getClass()
çağırma size geri verir:
class java.util.ArrayList
JLS 8.1.2: Generic Classes and Type Parameters bakınız:
genel bir sınıf bildirimi parametreli türleri bir dizi tanımlar (§4.5), türdeki her muhtemel başlatılmasının bir tür argümanlarına göre parametre . Bu parametrelenmiş türlerin tümü, çalışma zamanında aynı sınıfını paylaşır.
Vector<String> x = new Vector<String>();
Vector<Integer> y = new Vector<Integer>();
boolean b = x.getClass() == y.getClass();
değeri true
tutma değişken b
neden olur: kod yürütme Örneğin
. Başka bir deyişle
, getGenericSuperClass()
yöntem size sınıfınızı başlatmasını ederken kullandığınız gerçek tip argüman, ancak uzanan bir sınıfta kullanılan türü parametresi vermeyecektir. Şimdi, java.util.ArrayList
'un jenerik süper sınıfı AbstractList<E>
. Ve böylece aldığınız tip parametresi sadece E
olacaktır.
Ne yapmaya çalışıyorsunuz? –
Peki, listenin tipparametrisini yazdırıyorsunuz. –
Çalışma zamanı türünde parametre almaya çalışıyorum –