使用Java参数化类型和多态性的这种通用编程场景的方法

时间:2013-09-29 03:54:57

标签: java polymorphism generic-programming parametric-polymorphism parameterized-types

说我有一个界面:

public interface Foo { public void setId(int id); public int getId(); }

实现该接口的对象:

public class Bar implements Foo { ... } ;

我希望有一个通用函数,以Map<Id, Foo>

的形式创建一个Map

我还希望将private Map<Integer, Bar> barMap之类的成员变量设置为此地图的返回值。

以下内容:

private <T> Map<Integer, Foo> createMap(List<? extends Foo> foos) {
    Map<Integer, Foo> map = new LinkedHashMap<Integer,Foo>();
    for (Foo foo : foos) {
        map.put(foo.getId(), foo);
    }
    return map;
}

是合法的。

但是

List<Bar> barList = new ArrayList<Bar>();
barList.add(...);
...
Map<Integer, Bar> barMap = createMap(barList)

是非法的,因为我无法从Map<Integer, Foo>转换为Map<Integer, Bar>。我也不能把前者抛给后者。

我将如何做到这一点?

2 个答案:

答案 0 :(得分:2)

您应该使用T(类型参数) -

private <T extends Foo> Map<Integer, T> createMap(List<T> foos) {
    Map<Integer, T> map = new LinkedHashMap<Integer, T>();
    for (T foo : foos) {

当您这样做时,通用方法会在类型推断的帮助下返回Map<Integer, Bar>,而不是Map<Integer, Foo>

答案 1 :(得分:0)

尝试这样:

使用?在createMap方法的返回类型中扩展Foo。即你的密钥应该是整数,价值是扩展Foo的东西。