0

假设我有一个界面:

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

以及实现该接口的对象:

public class Bar implements Foo { ... } ;

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

我还希望将成员变量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>。我也不能将前者投给后者。

我将如何做到这一点?

4

2 回答 2

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>.

于 2013-09-29T04:06:16.840 回答
0

试试这样:

利用 ?在 createMap 方法的返回类型中扩展了 Foo。即你的键应该是整数,值是扩展 Foo 的东西。

于 2013-09-29T04:06:04.977 回答