2009-09-21 12 views
9

En Java, la interfaz del mapa se define como,Genéricos de Java: ¿Por qué Map.get() Ignora el tipo?

public interface Map<K,V> { 
    ... 
    V get(Object key); 
    ... 
} 

Por qué no?

V get(K key); 

Acabo de tropezar con un error desagradable porque se usa una clave de tipo incorrecta. Pensé que el objetivo de los genéricos es detectar el error de tipo temprano durante la compilación. ¿Esto derrota ese propósito?

+0

Puede encontrar algunas buenas respuestas aquí: [¿Cuáles son las razones por las que Map.get (clave Object) no es (completamente) genérica] (http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic) – NickDK

Respuesta

9

Kevin Bourrillion blogged about this hace un tiempo. Resumen:

De manera uniforme, los métodos del Marco de Java Colecciones (y el Google Colecciones Biblioteca también) nunca se restringir los tipos de sus parámetros excepto cuando es necesario para prevenir la colección de conseguir roto.

Personalmente, no soy partidario de ese enfoque, pero tiene cierto sentido dado el enfoque de varianza que también se ha tomado.

-3

Para agregar a @subtenante, Java está diseñado para que Java siempre sea compatible con versiones anteriores. Los genéricos no permiten las puts del tipo incorrecto, ya que esto no rompe la compatibilidad con versiones anteriores. La manera fácil de asegurarse de que se está utilizando la clave correcta es hacer esto.

K key = null; 
V value = null; 

Map<K,V> mapped = new HashMap<K,V>() 
.......//set the key and value.......... 
mapped.put(key, value) 
..... 
V var = mapped.get(key); 

Problema resuelto.
Una advertencia más para los genéricos, cualquier hijo de una clase también se puede colocar en una colección.

Number k= null; 
Number v= null; 

Map<Number,Number> mapped = new HashMap<Number,Number>() 
.......//set the key and value.......... 
k = double someDouble; 
v = int someInt; 
mapped.put(k, v) 
..... 

Esto podría causar algunos errores grandes !!

+0

realmente no veo dónde borrado entra en esto. La eliminación solo debería ser un problema si estás haciendo algo "inseguro". –

+0

Put() usa tipos de genéricos. Solo me quejo de obtener. –

+0

@ZZ Coder, que dirigió el ponerse en el juego superior de código, el segundo conjunto de código que estaba señalando otro problema común que algunos tienen el uso de los genéricos – WolfmanDragon

3

un objeto de un tipo puede ser .equals() para un objeto de otro tipo. get() solo requiere que el objeto que le proporcione sea .equals() con la clave que obtiene

+0

esto no es cierto. Obtengo ClassCastException, por lo que el tipo debe coincidir. –

+7

Si obtiene un ClassCastException entonces es igual a() se aplica de forma deficiente. Es una idea mejor para devolver false si los tipos son incompatibles. – finnw

Cuestiones relacionadas