为什么Map.remove()不使用类型参数?

时间:2016-01-15 10:24:29

标签: java generics collections

拥有以下简单的java代码:

Map<Integer,String> map = new HashMap<>();
//map.put("sd","A");
map.put(2,"B");
map.remove(2);
map.remove("A");

我只能放置整数键(因此注释行导致编译时错误)但我可以删除任何类键(因此最后一行有效)。 在put()中检查类型,但不在remove()中检查。

为什么Map.put方法使用key参数类型而remove方法没有?

编译器不会像在put()中那样通知我使用Integers作为键的类型,因此没有意味着尝试删除String键吗?

1 个答案:

答案 0 :(得分:2)

这是因为与旧Java版本(Java 1.4及更早版本)的向后兼容性,这些版本尚未具有泛型。

在旧的Java版本中,remove上的Map方法(以及其他方法)采用了Object类型的参数。当Java 5问世时,Sun / Oracle无法将此更改为remove(T obj),因为这会破坏向后兼容性 - 旧的源代码可能不会在没有更新Java版本的情况下编译。

当新的Java版本出现时,Oracle始终非常小心地保持向后兼容。