Soru Çalışma zamanında bir dizi türü verilen bir Java dizisi nasıl oluşturulur?


Java koleksiyonları çerçevesinde, Toplama arayüzü aşağıdaki yöntemi bildirir:

<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 isterseniz, nasıl bir dizi oluşturursunuz? birsadece çalışma zamanında mı bilinir?


19
2017-09-16 21:36


Menşei




Cevaplar:


Statik yöntemi kullan

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

Kullanımı hakkında bir öğretici burada bulunabilir: http://java.sun.com/docs/books/tutorial/reflect/special/arrayInstance.html


33
2017-09-16 21:44





ArrayList'in nasıl yaptığını inceleyerek:

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;
}

19
2017-09-16 21:39





Array.newInstance(Class componentType, int length)

3
2017-09-16 21:39





Genel bir türden yeni bir dizi oluşturmak için (ki bu sadece çalışma zamanında bilinir), bir dizi Nesne yaratmanız ve bunu genel türüne dökmeniz ve sonra bu şekilde kullanmanız gerekir. 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.

İşlev daha sonra verilen diziyi alır (a) ve onu kullanır (önceden boyutunu kontrol ederek) veya yeni bir tane oluşturur.


-1
2017-09-16 21:44



Diğer tüm cevaplardan farklı olarak, bu şekilde değil T bir dizi oluşturmak. Silme nedeniyle bir T [] 'ye 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! - Wouter Coekaerts