可能重复:Map.get(Object key)不是(完全)泛型Java泛型的原因是什么:为什么Map.get()忽略类型?
Java Map接口声明如下:
Interface Map<K,V>
它有这样一种方法:
boolean containsKey(Object key)
为什么不 boolean containsKey(K key) ?
boolean containsKey(K key)
相反,List接口的add方法采用泛型类型的参数而不是 Object :
Object
boolean add(E e).
它's the same reason why you can' t添加任何东西到 List<? extends E> 因为编译器不能保证类型安全(并且类型擦除使得运行时检查不可能) .
List<? extends E>
这意味着当你得到 Map<? extends K,V> 时,你将无法调用 contains(K) . 然而 contains 足够通用,将随机 Object 传递给它不会损坏接口(但会使一些错误更难以接收) .
Map<? extends K,V>
contains(K)
contains
接口在操作方式上是一致的,尽管我不能给出最初的原因 .
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)
在这两种情况下,contains方法都使用Objects,插入操作采用泛型类型 .
2 回答
它's the same reason why you can' t添加任何东西到
List<? extends E>
因为编译器不能保证类型安全(并且类型擦除使得运行时检查不可能) .这意味着当你得到
Map<? extends K,V>
时,你将无法调用contains(K)
. 然而contains
足够通用,将随机Object
传递给它不会损坏接口(但会使一些错误更难以接收) .接口在操作方式上是一致的,尽管我不能给出最初的原因 .
在这两种情况下,contains方法都使用Objects,插入操作采用泛型类型 .