(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?
Bu yöntemi nasıl çağırdınız? yöntem ("string", "başka"); '? – Thilo
Evet. MyClass mc = yeni MyClass (); mc.method ("ne", "the", "bir şey"); –
Mer
Eğer tip ek açıklamasını kaldırırsanız (sadece 'MyClass mc') o zaman Object []' olur mu? – Thilo