可能重复:
What are the reasons why Map.get(Object key) is not (fully) generic
我有一个关于Generic java集合的问题,特别是Map。我注意到需要参数(通常是键)的get,contains和类似方法将Object作为参数,而我希望它们采用类K的东西,例如而不是get(Object key)
我期望get(K key)
。任何人都可以解释这个原因吗?
答案 0 :(得分:2)
正如它所说here,这是因为你传递给get的对象不必等于你想要检索的键的类型。
唯一的条件是他们的equals
方法返回true
。
编辑:正如Peter Lawrey指出的那样,hashcode
应该是相同的。
答案 1 :(得分:0)
主要问题是向后兼容性。
即使您“知道”它无法正常工作,也始终可以尝试执行以下操作
Map map = new HashMap();
map.put("hello", "world");
Object o = map.get(1); // null
boolean b = map.contain(2); // false
boolean b2 = map.remove(3); // false
因此,即使泛型暗示它总是返回null
或false
,这些方法仍然需要能够采用任何类型。
还可以构造一个TreeMap,其中键不需要是相同的类型,等于true,具有相同的hashCode甚至compareTo()== 0
Map map = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return String.valueOf(o1).compareTo(o2.toString());
}
});
map.put("1", "one");
map.put(2, "two");
map.put(3L, "three");
map.put('4', "four");
for(Object o: new Object[] { 1L, '2', 3, "4"}) {
System.out.println(o.getClass().getSimpleName()+" "+o+" => "+map.get(o));
}
打印
Long 1 => one
Character 2 => two
Integer 3 => three
String 4 => four