[英]Approach to this Generic Programming Scenario with Java's Paramerterized Types and Polymorphism
说我有一个界面:
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>
。 我也不能把前者抛给后者。
我怎么做到这一点?
你应该使用那个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>
。
试试这样:
采用 ? 在createMap方法的返回类型中扩展Foo。 即你的密钥应该是整数,价值是扩展Foo的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.