2008-09-16 14 views
18

, Koleksiyon arayüzü aşağıdaki yöntemi bildirir:Çalışma zamanında bir dizi türü verilen bir Java dizisi nasıl oluşturulur? Java koleksiyonları çerçevesinde

<T> T[] toArray(T[] a)

Bu koleksiyondaki tüm öğeleri içeren bir dizi döndürür; döndürülen dizinin çalışma zamanı türü belirtilen dizininki. Koleksiyon belirtilen diziye sığarsa, oraya iade edilir. Aksi takdirde, belirtilen dizinin çalışma zamanı türü ve bu koleksiyonun büyüklüğü ile yeni bir dizi tahsis edilir.

Bu yöntemi uygulamak istiyorsa, nasıl sadece çalışma zamanında bilinen bir türünden bir dizi, yaratacak?

ArrayList bunu nasıl bakarak

cevap

32

kullanımı üzerine bir öğretici burada bulunabilir

java.lang.reflect.Array.newInstance(Class<?> componentType, int length) 

statik yöntemi kullanın (Sadece çalışma zamanında bilinir) genel bir türden yeni bir dizi oluşturmak, bir dizi oluşturmanız gerekir Nesneler ve sadece jenerik türüne dökün ve sonra böyle kullanın. Bu, Java'nın (silme) jenerik uygulamalarının bir kısıtlamasıdır.

T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want. 

fonksiyonu daha sonra verilen diziyi alır: (a) ve (önceden bu boyutunu kontrol) veya yeni bir oluşturur kullanır.

3
Array.newInstance(Class componentType, int length) 
-1

için:

public <T> T[] toArray(T[] a) { 
    if (a.length < size) 
     a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); 
    System.arraycopy(elementData, 0, a, 0, size); 
    if (a.length > size) 
     a[size] = null; 
    return a; 
} 
+3

Diğer tüm yanıtların aksine, bu şekilde * bir dizi T oluşturmaz * Silme nedeniyle bir T [] öğesine atayabilirsiniz, ancak her zaman bununla kalmayacaksınız. Belirli bir örnekte T String ise ve orada oluşturduğunuz dizi (başka bir yönteme döndürülmüş) ve String [] öğesine atanmışsa (bir cast gerektirmez), beklenmedik bir ClassCastException alırsınız. Bu tip kirliliğin bir örneğidir. Yapma! –

İlgili konular