2011-12-08 11 views
7

Eventuali duplicati:
What are the reasons why Map.get(Object key) is not (fully) generic
Java Generics: Why Does Map.get() Ignore Type?Perché Map.containsKey() accetta un parametro Object invece di un tipo Specialized?

Java interfaccia Map è dichiarata in questo modo:

Interface Map<K,V> 

Ha un tale metodo:

boolean containsKey(Object key) 

Perché non boolean containsKey(K key)?

Al contrario, l'interfaccia List ha inserirlo metodo che accetta parametro di tipo generico anziché Object:

boolean add(E e). 

risposta

2

È lo stesso motivo per cui non è possibile aggiungere nulla a un List<? extends E> perché il compilatore non può garantire la sicurezza del tipo (e la cancellazione del tipo rende impossibile un controllo di runtime).

Ciò significa che quando si ottiene un Map<? extends K,V> non si sarà in grado di chiamare contains(K) su di esso. tuttavia contains è abbastanza generale che il passaggio casuale di Object s non danneggerà l'interfaccia (ma rende alcuni errori più difficili da rilevare).

0

Le interfacce sono coerenti in come operano, anche se non posso dare i motivi iniziali.

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) 

In entrambi i casi, il contiene metodi prendono oggetti, e le operazioni di inserimento prendono tipi generici.

Problemi correlati