2013-09-27 26 views
5

Neden böyle oluyor? Anonim jenerik sınıfı belirleme yöntemini yazacak olursam - her şey iyidir. Bu yöntemde nesne geçmesi Ama eğer - konsol çıkış E.Çalışma zamanı genel türü belirlemesi

public static void main(String[] args) { 

    printType(new ArrayList<Integer>() {}); 
    printType(new ArrayList<Integer>()); 

} 

public static void printType(final List<?> list) { 
    System.out.println(((ParameterizedType) list.getClass().getGenericSuperclass()).getActualTypeArguments()[0]); 
} 

Konsolu:

class java.lang.Integer 

E 

bana açıklayınız.

+0

Ne yapmaya çalışıyorsunuz? –

+0

Peki, listenin tipparametrisini yazdırıyorsunuz. –

+0

Çalışma zamanı türünde parametre almaya çalışıyorum –

cevap

7

İ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.

İlgili konular