我想拥有的是这样的:
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()会导致一个可怕的强制转换异常。有没有什么方法可以编写它,所以编译器会在上面的例子中警告我 - 并且也不需要丑陋的演员。
由于
答案 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;