3

我想要的是这样的:

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() 会导致一个可怕的强制转换异常。有什么方法可以编写它,以便编译器在上面的示例中警告我 - 并消除对丑陋演员的需要。

谢谢

4

2 回答 2

3

您可以围绕 a 创建一个包装器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);.

于 2012-10-24T23:22:03.193 回答
0

创建一个将类型固定为相同Map类型的自定义接口:

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

然后

private RelatedMap<? extends Content> relations;
于 2012-10-24T23:55:42.503 回答