2011-12-08 9 views
7

Duplicar posible:
What are the reasons why Map.get(Object key) is not (fully) generic
Java Generics: Why Does Map.get() Ignore Type?¿Por qué Map.containsKey() toma un parámetro Object en lugar de un tipo especializado?

Java Map interfaz se declara como esto:

Interface Map<K,V> 

Tiene un procedimiento de este tipo:

boolean containsKey(Object key) 

¿Por qué no boolean containsKey(K key)?

Por el contrario, la interfaz List tiene ADD método que toma el parámetro de tipo genérico en lugar de Object:

boolean add(E e). 

Respuesta

2

Es la misma razón por la que no se puede agregar nada a un List<? extends E> porque el compilador no puede garantizar el tipo de seguridad (y el tipo de borrado hace imposible la verificación del tiempo de ejecución).

Esto significa que cuando obtenga un Map<? extends K,V> no podrá llamar al contains(K) en él. sin embargo, contains es lo suficientemente general como para pasarle Object aleatorios no dañará la interfaz (pero hace que algunos errores sean más difíciles de detectar).

0

Las interfaces son consistentes en la forma en que operan, aunque no puedo dar las razones iniciales.

Interface Map<K,V> 
    boolean containsKey(Object key) 
    V put(K key, V value) 

Interface List<E> 
    boolean contains(Object o) 
    boolean add(E e) 

En ambos casos, la contiene métodos toman objetos, y las operaciones de inserción toman tipos genéricos.

Cuestiones relacionadas