Lanciare una serie di oggetti in una matrice della mia class prevista

Solo per la revisione, qualcuno può spiegare rapidamente che cosa impedisce di funzionare (in fase di compilazione):

private HashSet data; ... public DataObject[] getDataObjects( ) { return (DataObject[]) data.toArray(); } 

… e ciò che rende questo il modo in cui funziona:

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

Non sono chiaro sul meccanismo al lavoro con il casting (o qualunque cosa sia) che lo rende così.

Perché toArray() crea una matrice di Object e non puoi creare Object[] in DataObject[] semplicemente lanciandolo. toArray(DataObject[]) crea una matrice di DataObject .

E sì, è un difetto della class Collections e il modo in cui i Generics sono stati calzati in Java. Ci si aspetterebbe che Collection.toArray() possa restituire un array di E, ma non lo fa.

Cosa interessante della toArray(DataObject[]) : non è necessario rendere l’array “a” abbastanza grande, quindi è ansible chiamarlo con toArray(new DataObject[0]) se lo si desidera.

Chiamarlo come toArray(new DateObject[0]) è effettivamente meglio se si usa .length later per ottenere la lunghezza dell’array. se la lunghezza iniziale era grande e lo stesso object matrice che hai passato è stato restituito, puoi affrontare NullPointerException s più tardi

Ho fatto una domanda in precedenza sui generici di Java, e ho indicato queste FAQ molto utili: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

Per garantire la sicurezza del tipo durante il casting di un array come desiderato ( DataObject[] dataArray = (DataObject[]) objectArray; ), la JVM dovrebbe ispezionare ogni singolo object dell’array, quindi non è in realtà un’operazione semplice come un cast di tipo . Penso che sia il motivo per cui devi passare l’istanza dell’array, che riempie l’operazione toArray() .