Java Map,其中Value是与键相同类型的值的列表

时间:2012-10-24 23:11:53

标签: java generics collections

我想拥有的是这样的:

public abstract Class Content {
    private Map<Class<? extends Content>, List<? extends Content>> relations;
}

内容有一堆子类--A,B,C,D等......

最常见的用例是获取所有A:

public List<A> getA() {
    return (List<A>)relations.get(A.class);
}

有点好 - 除了丑陋的演员。

但真正的问题是没有什么可以阻止我做一些愚蠢的事情:

relations.put(A.class, List<B> myListOfBs);

所以上面调用getA()会导致一个可怕的强制转换异常。有没有什么方法可以编写它,所以编译器会在上面的例子中警告我 - 并且也不需要丑陋的演员。

由于

2 个答案:

答案 0 :(得分:3)

您可以围绕Map创建一个包装器,并使用通用方法来约束您的put方法:

 public class HeterogeneousContainer {
     private final Map<Class<? extends Content>, List<? extends Content>> map;

     public <T extends Content> void put(Class<T> type, List<T> values) {
         map.put(type, values);
     }


     public <T extends Content> List<T> get(Class<T> type) {
         //this warning can be safely suppressed after inspection
         return (List<T>) map.get(type); 
     }
 }

现在您知道,只要容器的用户没有正确使用它(即以原始形式),那么键和值必须对应......您无法调用put(B.class, listOfAs);

答案 1 :(得分:0)

创建一个自定义Map界面,将该类型修复为相同的类型:

interface RelatedMap<T> extends Map<Class<T>, List<T>> {}

然后

private RelatedMap<? extends Content> relations;