繁体   English   中英

使用Java的参数化类型和多态性来处理此通用编程方案

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM