为什么 Java Map<K、 V> 为 get 和 remove 方法采用非类型化参数?

2022-09-04 21:48:26

我在代码中遇到了一个错误,我使用错误的键从Java映射中获取一些我认为是使用Java泛型强类型的内容。在查看Map Javadocs时,许多方法(包括get和remove)都采用Object作为参数,而不是类型K(对于定义为Map的Map)。这是为什么呢?是否有充分的理由或它是API设计缺陷?


答案 1

我认为这是为了向后兼容旧版本的Map界面。不幸的是,情况就是这样,但是由于你是对的,如果这采用正确的类型会更好。


答案 2

因为如果传递给 get 方法的对象等于映射中存储的任何键,则映射将返回一个值。Equal并不意味着它们必须具有相同的类型,而是键和传递对象的相等方法以这样的方式实现,即不同的对象类型相互识别为相等。

当然,这同样适用于删除方法。


有效代码的示例,如果 get 方法只允许 K 类型的参数,则该代码将中断(不编译):

LinkedList<Number> k1 = new LinkedList<Number>();
k1.add(10);

ArrayList<Integer> k2 = new ArrayList<Integer>();
k2.add(10);

Map<LinkedList<Number>, String> map = new HashMap<LinkedList<Number>, String>();

map.put(k1, "foo");
System.out.println(map.get(k2));

推荐