java - programacion - ¿Pueden evitarse las advertencias no seleccionadas al anular un método con parámetros de tipo sin formato?
manual de programacion android pdf (4)
Extiendo una clase definida en una biblioteca que no puedo cambiar:
public class Parent
{
public void init(Map properties) { ... }
}
Si estoy definiendo una clase ''Child'' que amplía Parent y estoy usando Java 6 con genéricos, ¿cuál es la mejor manera de anular el método init sin obtener advertencias sin marcar?
public class Child extends Parent
{
// warning: Map is a raw type. References to generic type Map<K,V> should be parameterized
public void init(Map properties) { }
}
Si agrego parámetros genéricos, obtengo:
// error: The method init(Map<Object,Object>) of type Child has the same erasure as init(Map) of type Parent but does not override it
public void init(Map<Object,Object>) { ... }
// same error
public void init(Map<? extends Object,? extends Object>) { ... }
// same error
public void init(Map<?,?>) { ... }
Este error se produce independientemente de si utilizo un tipo específico, un comodín delimitado o un comodín ilimitado. ¿Existe una forma correcta o idiomática de anular un método no genérico sin advertencias y sin usar @SuppressWarnings ("desmarcado")?
Debe declarar el método con la misma firma que el padre y, por lo tanto, recibirá advertencias cuando compile. Puede suprimirlos con @SuppressWarnings ("desmarcado")
La razón por la que no hay forma de deshacerse de esto es que las advertencias están ahí para hacerle saber que es posible crear colecciones con tipos no válidos en ellas. Las advertencias solo deberían desaparecer cuando se haya eliminado todo el código que podría permitir eso. Como hereda de una clase no genérica, siempre será posible crear una Colección con contenido no válido.
Respuesta corta: no hay manera de hacer eso.
Respuesta insatisfactoria: desactive las advertencias (específicas) en su IDE / build.xml.
Si no puede cambiar la biblioteca, por desgracia, debe seguir métodos no genéricos.
El problema es que, a pesar de que después del borrado de tipo ambos init () tienen la misma firma, de hecho pueden ser métodos diferentes, o lo mismo (*). El compilador no puede decir si debe anular o sobrecargar, por lo que está prohibido.
(*) Supongamos que el desarrollador de la biblioteca quiere decir init (Map <String, Integer>). Ahora está implementando init (Map <String, String>). Esto es una sobrecarga y deben existir dos métodos en el vtable de la clase Child.
Pero, ¿y si el desarrollador de la biblioteca se refería a init (Map <String, String>)? Luego está anulando, y su método debería reemplazar el init original en la clase Child, y solo habría un método en la tabla vtable de Child.
PD Odio cómo Generics implementó en Java :-(
Sí, debe declarar el método de anulación con la misma firma que en la clase principal, sin agregar ninguna información de genéricos.
Creo que la mejor @SuppressWarnings("unchecked")
es agregar la @SuppressWarnings("unchecked")
al parámetro de tipo @SuppressWarnings("unchecked")
, no el método, por lo que no silenciará otras advertencias de genéricos que pueda tener en su propio código.
Creo que la respuesta anterior significa decir @SuppressWarnings ("tipos de raw") en su lugar.