2011-01-13 12 views
8

Duplicar posible:
What are the reasons why Map.get(Object key) is not (fully) generic¿Por qué java.util.Map.get (...) no es genérico?

Este método y un número de otros métodos en la interfaz del mapa no son genéricos. Casi en cualquier lugar donde se espera un valor clave como parámetro, acepta Object en su lugar, es decir, remove, get y containsKey.

Alguna idea de por qué tomaron esta decisión. Mi suposición es que se hizo para apoyar el código heredado, pero para mí, creo que es una posición débil.

¿Alguien me puede dar una razón específica por la que sería preferible aceptar Objeto aquí en lugar de KeyType?

+3

Esta pregunta se ha hecho muchas veces en los últimos 6 años. Le sugiero que busque las respuestas existentes –

+0

Lo mismo con eliminar, containsValue, containsKey, ... – aioobe

Respuesta

8

Los objetos utilizados para recuperar/eliminar/verificar la existencia de una clave determinada no tienen que ser necesariamente del mismo tipo que el objeto utilizado para almacenarla (= la clave).

Necesita ser equal y devolver el mismo hashCode como la clave, pero nada en la especificación dice que debe ser del mismo tipo.

Este hecho raramente se usa y la mayoría de las veces recuperará los valores con las mismas claves (o al menos objetos del mismo tipo) que las que usa para almacenarlas.

Pero dado que se trataba de un caso de uso admitido en el "viejo" HashMap, también debe admitirse en la versión de genéricos.

Tenga en cuenta que todos los métodos que keySet() usan del tipo específico, ya que es seguro devolver exactamente los objetos utilizados como claves cuando se llamó al put().

+0

Ah, muy bien. Gracias por responder. Supongo que tiene un poco de sentido. Supongo que podría buscar por enteros un mapeo que use dobles como claves ... –

+0

@Kevin: ese examen específico no funcionará, porque 'Integer' y' Double' no tienen implementaciones 'equals()' compatibles. –

Cuestiones relacionadas