java - 使用 Java 参数化类型和多态性实现这种通用编程场景的方法

标签 java polymorphism generic-programming parametric-polymorphism parameterized-types

假设我有一个界面:

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/

相关文章:

java - Esper 外部定时 View 失败并带有时间戳?

haskell - 索引到容器 : the mathematical underpinnings

c - Valgrind 错误和每个元素一个分配的通用列表

java - 修改 else if 和 |运营商

java - DialogListener 的 startActivity 导致应用程序崩溃

c++ - 我可以获得调用静态方法的类吗?

c++ - 为什么不能在编译时解决运行时多态性?

python - 根据 Django 模型中的字段值选择方法

c++ - 基本类型的模板特化

Java ObjectInputStream java.io.EOFException