2012-02-12 6 views
15

Sto provando a creare una copia superficiale di un hash di punti chiamato myHash. A partire da ora, ho il seguente:Come evitare l'avviso di cast non controllato durante la clonazione di un hashset?

HashSet<Point> myNewHash = (HashSet<Point>) myHash.clone(); 

Questo codice mi dà tuttavia un avviso di cast non controllato. C'è un modo migliore per farlo?

+0

http://www.velocityreviews.com/forums/t153068-clones-generics-and-unchecked-cast-warnings .html – Borealid

risposta

34

Si può provare questo:

HashSet<Point> myNewHash = new HashSet<Point>(myHash); 
+3

+1: questa è una soluzione migliore. clone() è una cattiva idea. – duffymo

+1

@TedHopp: perfetto. Grazie. – Tim

+0

ancora questo codice è uguale a 'addAll (myHash)', quindi itera su tutta la collezione e aggiunge ogni elemento a mano, mentre 'clone()' esegue una ricreazione più veloce della mappa sottostante usando il metodo pacchetto-privato 'putMapEntries() '... * sigh * questo è esattamente il motivo per cui ho scritto la mia HashMap/HashSet anni fa, ed è esattamente il motivo per cui esistono così tante sostituzioni di collezioni ... – vaxquis

3

una risposta diversa suggerisce di utilizzare new HashSet<Point>(myHash). Tuttavia, l'intento di clone() è di ottenere un nuovo oggetto dello stesso tipo. Se è un'istanza di una sottoclasse di HashSet, qualsiasi comportamento aggiuntivo aggiunto dalla sottoclasse verrà perso utilizzando new HashSet<Point>(myHash).

Un avviso di trasmissione non controllato è solo un avviso. Ci sono molte situazioni in cui il cast è sicuro, ma il compilatore non è abbastanza intelligente da determinare che è sicuro. È possibile, tuttavia, isolare l'avvertimento in un unico metodo che può essere annotato con @SuppressWarnings("unchecked"):

@SuppressWarnings("unchecked") 
static <T implements Cloneable> clone(T o) { return (T)(o.clone()); } 
Problemi correlati