【问题标题】:Generics and inheritance: need a complex Map instance泛型和继承:需要一个复杂的 Map 实例
【发布时间】:2012-11-30 11:51:35
【问题描述】:
public abstract class Mother {
}

public class Daughter extends Mother {
}

public class Son extends Mother {
}

我需要一个Map,哪些键是DaughterSon 类之一,哪些值是这两个类之一的对象列表,分别

例如:

/* 1. */ map.put(Daughter.class, new ArrayList<Daughter>()); // should compile
/* 2. */ map.put(Son.class, new ArrayList<Son>()); // should compile
/* 3. */ map.put(Daughter.class, new ArrayList<Son>()); // should not compile
/* 4. */ map.put(Son.class, new ArrayList<Daughter>()); // should not compile

我试过Map&lt;Class&lt;T extends Mother&gt;, List&lt;T&gt;&gt;,但编译不出来。

Map&lt;Class&lt;? extends Mother&gt;, List&lt;? extends Mother&gt;&gt; 可以编译,但 3.4. 的情况也可以编译,但不应该编译。

有可能吗?

【问题讨论】:

  • 在当前限制下不可能
  • 那么你的 Map 最多包含 2 个元素?

标签: java generics inheritance map


【解决方案1】:

我认为不可能在类型中对此进行编码,我会使用自定义类来实现

class ClassMap<T> {
  private Map<Class<? extends T>, List<? extends T>> backingMap = new HashMap<>();

  public <E extends T> void put(Class<E> cls, List<E> value) {
    backingMap.put(cls, value);
  }

  @SuppressWarnings("unchecked")
  public <E extends T> List<E> get(Class<E> cls) {
    return (List<E>)backingMap.get(cls);
  }
}

只要不将backingMap 引用泄漏到此类之外,在此处禁止显示警告是安全的。

【讨论】:

  • 有趣的替代解决方案 ;)
【解决方案2】:

假设您正在寻找一张地图,不,这是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多