, foo()
güvenli değildir, @SafeVarargs ile işaretleme yöntemi ile [2]
<T extends List<?>> void foo(T... args)
{
List<String>[] array2 = (List<String>[])args;
array2[0] = a_list_of_string;
}
void test2()
{
List<Integer>[] args = ...; // [1]
foo(args);
Integer i = args[0].get(0); // [2]
}
de soruna neden, dizideki olmayan T depolayabilir, size olduğu derleyici söz bunun gibi yaramaz bir şey yapmamak.
Ama başlangıçta [1] 'de genel bir dizi nasıl başlayabiliriz? Java jenerik dizi oluşturulmasına izin vermez!
jenerik dizi yaratılış
yalnızca tasdikli yolu
foo(list_int_1, list_int_2)
sonra dizi arayana erişemeyeceği bir vararg yöntemini çağırarak zaman , arayan [2] Zaten fark etmez yapamaz foo()
dizisi ile nasıl karışıyor.
Ama o zaman jenerik Array
@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
return Arrays.copyOf(array, length);
}
List<String>[] array1 = newArray(10);
ve
@SafeVarargs
static <E> E[] array(E... array)
{
return array;
}
List<String>[] array2 = array(list1, list2);
yüzden sonuçta jenerik dizi oluşturabilir literal jenerik dizi oluşturmak için arka kapı olduğunu düşün. .. Aptal Java, bunu yapmamızı engellemeye çalışıyor.
Varargs yöntemleri olmadan genel diziler oluşturabilirsiniz, ancak [Array # newInstance (Sınıf > tipi, int uzunluk]] (http://tinyurl.com/3uzbb7v) 'i kullanmanız ve yayınlamanız gerekir. Tam cevap için teşekkürler. – Jeffrey
Gerçekten "basitleştirme" değil, geliştirilmiş bir ipucu. –
Bu örneği deniyorum ve @SafeVarargs kullanıp kullanmadan davranışta bir değişiklik göremiyorum. Hala bir uyarı alıyorum "Tip Güvenliği: Genel bir liste ...." –
excalibur