Esto es realmente un problema. Si alguien llama al remove(o)
y o
el tipo no es E
, generalmente es un error de programación que intenta eliminar algo incorrecto. La verificación de tipo no pudo protegernos del error.
Aunque un buen IDE (IntelliJ) puede detectar tales problemas y advertirnos, los diseñadores de API deberían haber proporcionado una firma más precisa para utilizar la verificación del tipo de compilador. (IDE engaña aquí -. Conoce el significado de Set.remove()
porque es una API estándar IDE no proporcionará la misma ayuda para las API personalizados)
Para API de consulta como , que está bien aceptar una E
argumento no y el retorno un falso trivial Así que podemos tener ambas cosas
boolean contains(Object o);
boolean contains2(E o);
Para API mutación como remove()
, es discutible si se debe aceptar un argumento no E
.Sin embargo, el debate va a ser discutible, dada la realidad del borrado: en realidad no hay otra opción que aceptar el argumento no E y guardar silencio al respecto. Todavía podemos tener dos métodos
boolean remove(Object o);
boolean remove2(E o);
En la mayoría de los casos, los programadores pueden llamar contains2/remove2
para la seguridad de tipos adicional.
relacionado: http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic –
posible duplicado de [¿Por qué no son Java? Las colecciones eliminan los métodos genéricos?] (Http://stackoverflow.com/questions/104799/why-arent-java-collections-remove-methods-generic) – PhoneixS