3

可能重复:
Map.get(Object key) 不是(完全)通用的原因是什么

我有一个关于通用 java 集合的问题,特别是 Map。我注意到需要参数(通常是键)的 get、contains 和类似方法将 Object 作为参数,而我希望它们采用 K 类的东西,例如,而不是get(Object key)我所期望get(K key)的。谁能解释这个原因?

4

2 回答 2

2

正如这里所说,这是因为您传递给 get 的对象不必等于您尝试检索的密钥的类型。

唯一的条件是他们的equals方法返回true

编辑:正如彼得劳里指出的那样,hashcode应该是一样的。

于 2012-09-19T14:06:19.857 回答
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

因此,这些方法仍然需要能够采用任何类型,即使泛型暗示它将始终返回nullor 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
于 2012-09-19T14:06:19.420 回答