2008-12-27 12 views
28

Sadece inceleme için, birisinin bu çalışmayı engelleyeceğini hızlı bir şekilde açıklayabilir (derleme sırasında):Hızlı Java sorusu: Nesneler dizisini amaçlanan sınıfımın bir dizisine dökme

private HashSet Data; 

... 

public DataObject[] getDataObjects() 
{ 
    return (DataObject[]) Data.toArray(); 
} 

... ve bu işin yolunu bu şekilde yapar:

public DataObject[] getDataObjects() 
{ 
    return (DataObject[]) Data.toArray(new DataObject[ Data.size() ]); 
} 

işleyiş mekanizmasındaki döküm ile (ya da her neyse) bunu açık hale getirir.

cevap

37

toArray(), bir Nesne dizisi oluşturduğundan ve 'u yalnızca DataObject[]'a dönüştürerek yapamazsınız. toArray(DataObject[]), DataObject dizisini oluşturur.

Ve evet, koleksiyon sınıfının bir kusuru ve Generics'in Java'ya ayakkabı atma şeklidir. Collection<E>.toArray()'un bir E dizisini döndürebileceğini beklersiniz, ancak yoktur.

toArray(DataObject[]) çağrı hakkında ilginç bir şey: "a" dizisini yeterince büyük yapmak zorunda değilsiniz, böylece isterseniz toArray(new DataObject[0]) ile arayabilirsin.

toArray(new DateObject[0]) gibi adlandırmak, dizi uzunluğunu almak için daha sonra .length kullanırsanız daha iyidir. İlk uzunluk büyüktü ve geçirilen aynı dizi nesne sonra siz NullPointerException s

Java jenerik hakkında daha önce bir soru sordu ve çok yararlı oldu bu SSS işaret edildi karşılaşabilecekleri döndürüldü ise: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+0

Tamam. Object [] 'i DataObject []' e atamanın bir yolu var mı? Aksi halde, bu işlevin ne olduğunu anlamıyorum. Üzgünüm, şu aptal soruları şu an yoldan çıkarmaya çalışıyorum, o zaman beni daha sonra uğramamaları için. –

+0

Korkarım ki yok. Diğer toArray çağrısını kullanmanız yeterlidir. –

+0

Hayır, yeni bir dizi oluşturabilir ve nesnelerinizi tek tek atabilirsiniz. Java'da diziler gitmenin yolu değildir. – Henning

3

Amaçlanan bir diziyi (DataObject[] dataArray = (DataObject[]) objectArray;) yayınlarken tür güvenliğinden emin olmak için, JVM dizideki her bir nesneyi incelemek zorundadır, bu nedenle aslında bir tür döküm gibi basit bir işlem değildir. Bence bu nedenle, toArray() işleminin ardından doldurduğu dizi örneğini geçmek zorundasınız.

İlgili konular