假设我有一个界面:
public interface Foo { public void setId(int id); public int getId(); }
以及实现该接口(interface)的对象:
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>
。我也无法将前者转换为后者。
我该如何实现这个目标?
最佳答案
您应该使用 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>
.
关于java - 使用 Java 参数化类型和多态性实现这种通用编程场景的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19074220/