2012-02-12 5 views
15

Estoy tratando de hacer una copia superficial de un HashSet of Points llamado myHash. A partir de ahora, tengo lo siguiente:¿Cómo evitar la advertencia de lanzamiento sin marcar al clonar un HashSet?

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

Este código me da una advertencia de lanzamiento sin marcar sin embargo. ¿Hay una mejor manera de hacer esto?

+0

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

Respuesta

34

Puede probar esto:

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

+1 - esta es una mejor solución. clone() es una mala idea. – duffymo

+1

@TedHopp: Perfecto. Gracias. – Tim

+0

pero este código es igual a 'addAll (myHash)', por lo que itera sobre la colección y agrega cada elemento a mano, mientras 'clone()' realiza una recreación más rápida del Mapa subyacente usando el método privado del paquete 'putMapEntries() '... * suspiro * eso es exactamente por lo que escribí mi propio HashMap/HashSet hace siglos, y esa es exactamente la razón por la que existen tantos reemplazos de colección ... – vaxquis

3

una respuesta diferente sugiere el uso de new HashSet<Point>(myHash). Sin embargo, la intención de clone() es obtener un nuevo objeto del mismo tipo. Si myHash es una instancia de una subclase de HashSet, cualquier comportamiento adicional agregado por subclases se perderá al usar new HashSet<Point>(myHash).

Una advertencia de lanzamiento desactivada es solo una advertencia. Hay muchas situaciones en las que el elenco es seguro, pero el compilador simplemente no es lo suficientemente inteligente como para determinar que es seguro. Puede, sin embargo, aislar la advertencia en un único método que puede ser anotado con @SuppressWarnings("unchecked"):

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