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 に答える