说我有一个界面:
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>
。我也不能把前者抛给后者。
我将如何做到这一点?
答案 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的东西。