2011-10-22 17 views
15

Java 7'de, bir yeniden bağlanılamaz varargs parametresiyle bir yöntem derlenirken aldığınız uyarıyı bastırmak için @SafeVarargs ek açıklaması yapma seçeneğiniz vardır. Project Coinin proposal, yöntem varargs dizisinde yalnızca varargs parametresiyle aynı türde öğelerin depolanmasını sağlayan yöntem kullanıldığında ek açıklamanın kullanılmasını şart koşar.Basitleştirilmiş Varargs Java'da Yöntem Çağırma 7

Güvenli olmayan bir yöntemin örneği ne olurdu? Örneğin

cevap

21

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

+1

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

+0

Gerçekten "basitleştirme" değil, geliştirilmiş bir ipucu. –

+0

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

İlgili konular