Creo que obtengo lo que significa no verificando el reparto (de uno a otro tipo diferente), pero ¿qué significa "verificar" el reparto? ¿Cómo puedo verificar el reparto para poder evitar esta advertencia en Eclipse?¿Qué es un yeso no revisado y cómo lo verifico?
Respuesta
Unchecked significa que estás (implícita o explícitamente) lanzando desde un tipo genérico a un tipo no calificado o al revés. P.ej. esta línea
Set<String> set = new HashSet();
producirá una advertencia.
Por lo general, hay una buena razón para tales advertencias, por lo que debe intentar mejorar su código en lugar de suprimir la advertencia. Cita de Effective Java, 2nd Edition:
Elimine todas las advertencias sin marcar que pueda. Si elimina todas las advertencias, tiene la seguridad de que su código es seguro, lo que es muy bueno para . Significa que no obtendrá un
ClassCastException
en tiempo de ejecución, y aumenta su confianza de que su programa se comporta como lo desea.Si no puede eliminar una advertencia, y se puede demostrar que el código que provocó la advertencia es typesafe, entonces (y sólo entonces) suprimir la advertencia con una anotación
@SuppressWarnings("unchecked")
. Si suprime las advertencias sin primero probar que el código es seguro, solo se está dando un falso sentido de seguridad . El código puede compilarse sin emitir ninguna advertencia, pero todavía puede arrojar unClassCastException
en tiempo de ejecución. Sin embargo, si ignora advertencias sin marcar que sabe que son seguras (en lugar de suprimirlas), no se dará cuenta cuando aparezca una nueva advertencia que represente un problema real. La nueva advertencia se perderá en medio de todas las falsas alarmas que no haya silenciado.
Por supuesto, no siempre es tan fácil eliminar las advertencias como con el código anterior. Sin embargo, sin ver su código, no hay manera de decir cómo hacerlo seguro.
¿Qué hay de este elenco sin control: 'FoodBag > bag2 = new FoodBag
@Datoraki, ¿podría ser más específico con su pregunta? –
-1 porque la respuesta no aborda la parte de la pregunta "Cómo verificar". Ok, sabemos que debemos verificar el reparto, ** ¿cómo ** lo hacemos? – Mike
Para ellaborate más en lo que Pedro escribió:
Yesos de tipos no genéricos a tipos genéricos puede funcionar muy bien en tiempo de ejecución, ya que los parámetros genéricos se borran durante la compilación, por lo que se quedan con un elenco legítimo. Sin embargo, el código puede fallar más tarde con una ClassCastException inesperada debido a una suposición incorrecta con respecto al parámetro de tipo. Por ejemplo:
List l1 = new ArrayList();
l1.add(33);
ArrayList<String> l2 = (ArrayList<String>) l1;
String s = l2.get(0);
La advertencia sin comprobar en la línea 3 indica que el compilador no es capaz de garantizar la seguridad de tipos más, en el sentido de que un ClassCastException inesperado puede aparecer dentro somewere más tarde. Y esto sucede en la línea 4, que realiza un lanzamiento implícito.
Esta debería ser la respuesta aceptada – CodyBugstein
Un modelo no seleccionado, a diferencia del modelo verificado, no verifica la seguridad del tipo en tiempo de ejecución.
Aquí hay un ejemplo basado en la sección Consider typesafe heterogenous containers
de la 3ª ed.de "Effective Java" por Joshua Bloch, pero la clase de contenedor se rompe intencionadamente - almacena y devuelve el tipo incorrecto:
public class Test {
private static class BrokenGenericContainer{
private final Map<Class<?>, Object> map= new HashMap<>();
public <T> void store(Class<T> key, T value){
map.put(key, "broken!"); // should've been [value] here instead of "broken!"
}
public <T> T retrieve(Class<T> key){
// return key.cast(map.get(key)); // a checked cast
return (T)map.get(key); // an unchecked cast
}
}
public static void main(String[] args) {
BrokenGenericContainer c= new BrokenGenericContainer();
c.store(Integer.class, 42);
List<Integer> ints = new ArrayList<>();
ints.add(c.retrieve(Integer.class));
Integer i = ints.get(0);
}
}
Si el retrieve()
utiliza un fundido sin control-(T)map.get(key)
- la ejecución de este programa se conducir a ClassCastException
que ocurre en la línea Integer i = ints.get(0)
. El método retrieve()
completará porque el tipo real no se comprobó en tiempo de ejecución:
Exception in thread "main"
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at Test.main(Test.java:27)
Pero si el retrieve()
utiliza un activado Nuestros fundido - key.cast(map.get(key))
- ejecutar este programa conducirá a ClassCastException
que ocurre en key.cast(map.get(key))
línea, porque el elenco verificado descubrirá que el tipo es incorrecto y arrojará la excepción. El método retrieve()
no completará:
Exception in thread "main" java.lang.ClassCastException:
Cannot cast java.lang.String to java.lang.Integer
at java.lang.Class.cast(Class.java:3369)
at Test$BrokenGenericContainer.retrieve(Test.java:16)
at Test.main(Test.java:26)
Poca diferencia que pueda parecer, pero en el caso de la fundición sin control, un String
realizado con éxito su camino en un List<Integer>
. En aplicaciones del mundo real, las consecuencias de esto pueden ser ... bueno, severas. En el caso del yeso marcado, el desajuste de tipo se descubrió lo más temprano posible.
Para evitar los moldes sin marcar, advirtiendo, @SuppressWarnings("unchecked")
se puede utilizar, si el programador es realmente seguro de que el método es de hecho seguro. La mejor alternativa es usar genéricos y modelos controlados cuando sea posible.
Como Joshua Bloch puso,
... sin marcar advertencias son importantes. No los ignores
En aras de la exhaustividad, this ofertas de respuestas con los detalles Eclipse.
- 1. ¿Es esto un yeso o una construcción?
- 2. ¿Qué es ct100 y cómo lo cambio?
- 3. ¿Qué es makeinfo y cómo lo obtengo?
- 4. ¿Ir o no ir con Liferay? ¿Qué es lo bueno, lo malo y lo feo?
- 5. ¿Cuál es el patrón de constructor revisado?
- 6. ¿Qué es un Manifiesto en Scala y cuándo lo necesitas?
- 7. revisado tipo fundido en un árbol de expresiones?
- 8. ¿Qué es un bus de servicio y cuándo lo necesito?
- 9. MSBuild: ¿Qué es y cuándo lo necesito?
- 10. ¿Qué es SAPI y cuándo lo usarías?
- 11. Marshalling: ¿qué es y por qué lo necesitamos?
- 12. ObjectSpace: ¿qué es y cómo lo usa la gente?
- 13. ¿Qué es XML BOM y cómo lo detecto?
- 14. ¿Qué es el paster y cómo lo instalo?
- 15. ¿Qué es lo opuesto a un nbsp?
- 16. ¿Qué es Redis pubsub y cómo lo uso?
- 17. ¿Qué es la cobertura del código y cómo lo mides?
- 18. lo que es Contexto Android y por qué es necesario
- 19. ¿Qué es el/elemento? ¿Como lo uso? ¿Y por qué?
- 20. ¿Cómo verifico si un directorio es grabable en PHP?
- 21. ¿Qué es Repo y por qué lo usa Google?
- 22. ¿Cómo verifico si un valor dado es una lista genérica?
- 23. ¿Cómo reconocer qué es y qué no es recursividad final?
- 24. ¿Qué significa esto y cómo lo ayuda?
- 25. ¿Cómo verifico un certificado SSL en python?
- 26. Cómo verifico que un elemento no existe en Selenium 2
- 27. ¿Qué es lo opuesto a "es"?
- 28. ¿Cómo verifico si un repositorio está vacío?
- 29. ¿Cómo verifico un conjunto de duplicados?
- 30. ¿Qué es exactamente streambuf? ¿Como lo uso?
Publique el código fuente. –
¡No publique el código! No dejes que te den pescado en lugar de enseñarle a pescar :) No, en serio, debería haber una respuesta genérica para una pregunta genérica, incluso si la pregunta se hace en un estilo amateur. – Mike