2014-09-04 44 views
7

(Ben parametreli sınıfta kullanılan burada genel bir argüman, başvurmak için T kullanacağız.) Ben bağımsız değişken olarak kullanıldığında T... yığın kirliliğinin potansiyel bir kaynağı olduğu nedeni derleyici olduğunu çok okunanT ... (generics vararg parametresi) gerçekten derleme zamanında Object [] 'a sıyrıldı mı?

normal (T[] dizileri izinli) kuralı için bir kural dışı durum oluşturur ve T... (varargs, ve normalde varargs kurallarına göre dahili olarak T[]'a çevirir, ancak bunun dışında jeneriklerle buna izin verilmez) bir parametre olarak uygulanır. dahili olarak, bir ham tipmiş gibi, bunun yerine Object[] dizisine dönüştürülür.

Bu yüzden, bunu doğrulamak için, kavramı belleğime yapıştırmak için bir kod yazdım.

System.out.println 'd System.out.println' d System.out.println 'yöntemini System.out.println' a bir yöntem olarak T...t aldım. Object[] sınıfını almayı bekledim, ancak bunun yerine T[] sınıfına sahibim.

Bu nedenle, derleyici'u T[]'a dahili olarak dönüştürür ve Object[]'a dönüştürmez.

örn.

public class MyClass<T>{ 
public void method(T...t) 
{ 
    System.out.println(t.getClass().getName()); //for MyClass<String>, this gives me 
               //[Ljava.lang.String 

} 

Burada neyim var? Ve derleyici, jenerik varargs parametresini dahili olarak Object[]'a dönüştürmezse, tür güvenliği nasıl kaybedilir ve potansiyel bir yığın kirliliği kaynağı olarak nasıl davranılır?

+0

Bu yöntemi nasıl çağırdınız? yöntem ("string", "başka"); '? – Thilo

+0

Evet. MyClass mc = yeni MyClass (); mc.method ("ne", "the", "bir şey"); – Mer

+0

Eğer tip ek açıklamasını kaldırırsanız (sadece 'MyClass mc') o zaman Object []' olur mu? – Thilo

cevap

10
void method(T... t) 

böylece duymuş neyi doğru

void method(Object[] t) 

dönüştürülür alır. Ama: böylece t çalışma zamanı türünün beyan tipi (derleme sonra) Object[] olsa bile Integer[] olduğunu

Integer a = 1, b = 2, c = 3; 
method(new Integer[] {a, b, c}); 

:

Integer a = 1, b = 2, c = 3; 
method(a, b, c); 

dönüştürülmüş olur.

+0

Bileşen türü derleyici tarafından jenerik tür açıklamadan alınır mı? Yoksa gerçek argümanlardan çıkarılmış mıdır? – Thilo

+0

Teşekkür ederiz! derlenmiş bir tip void yöntem ise derleyici yine yöntem görüşme MyClass red etmez neden rağmen, ([] t Object) mc = yeni sınıfı bir (); mc.method ("ne", "the", "bir şey", 4); Derleyici iletisiyle: "Yöntem yöntemi (Dize ...) (String, String, String, int) argümanlar için geçerli değildir GenericsReview tip" (int reddi mc.method beri, bir Autoboxing başarısızlık değil ("ne", "" , "bir şey", yeni Tamsayı (4)), ayrıca reddedilir.) – Mer

+0

@Thilo Tahmin ediyorum (kesin olarak bilmiyorum) gerçek argümanlardan çıkarıyorum. Belki de 'T'' 'Object' ile değiştirmeyi deneyin. ve Integer [] 'in instanceof olduğunu doğrulayın. – immibis

İlgili konular