采用Object参数的通用类 - Java

时间:2012-09-19 14:00:57

标签: java generics

  

可能重复:
  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)。任何人都可以解释这个原因吗?

2 个答案:

答案 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

因此,即使泛型暗示它总是返回nullfalse,这些方法仍然需要能够采用任何类型。


还可以构造一个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