Java:多态性应用于Map泛型类型

时间:2015-07-23 12:36:45

标签: java generics polymorphism

我希望有一个函数(例如)在两种情况下都输出Map的所有值:

Map<String, String> map1 = new HashMap<String, String>();
Map<String, Integer> map2 = new HashMap<String, Integer>();
output(map1, "1234");
output(map2, "4321");

以下似乎不起作用:

public void output(Map<String, Object> map, String key) {
    System.out.println(map.get(key).toString()); 
}

类型String的{​​{1}}和Integer都不是吗?

2 个答案:

答案 0 :(得分:9)

Map<String, String>不会延伸Map<String, Object>,就像List<String>不延伸List<Object>一样。您可以将值类型设置为?通配符:

public void output(Map<String, ?> map, String key) {  // map where the value is of any type
    // we can call toString because value is definitely an Object
    System.out.println(map.get(key).toString());
}

答案 1 :(得分:1)

您正在寻找的是在Java中尝试在Collections上引入多态,并称为Generics。更具体的用例,Wildcards符合要求。

@manouti在他的回答中使用无界通配符(请参阅通配符链接中的详细信息),但您可以使用更具体的内容:上限通配符

E.g。 Map<String, ? extends Object>其中Object通常是最具体但仍然是通用的类,必须从中派生所有使用的类。例如,如果您所有地图中的值都有一个共同的父级(或超级&#39;)类YourParentClass,那么您可以在我的示例中用该类名替换Object