次のようなシングルトンであるワイルドカード型のコレクションを持つクラスがあります。
public ObliviousClass{
private static final ObliviousClass INSTANCE = new ObliviousClass();
private Map<Key, Type<?>> map = new HashMap<Key, Type<?>>();
public void putType(Key key, Type<?> type){
map.put(type);
}
// returns the singleton
public static ObliviousClass getInstance(){
return INSTANCE;
}
}
クライアント コードで、このコレクションにさまざまなパラメーター化された型を追加できるようにしたいと考えています。
void clientMethod(){
ObliviousClass oc = ObliviousClass.getInstance();
Type<Integer> intType = ...
Type<String> stringType = ...
oc.putType(new Key(0), intType);
oc.putType(new Key(1), stringType);
}
ここまでは、私が理解しているように、すべて問題ありません。Type<?>
ただし、クライアントは提供されたを取得できる必要もありますKey
。したがって、次のようなメソッドが に追加されObliviousClass
ます。
public Type<?> getType(Key key){
return map.get(key);
}
しかし、手元にあるEffective Javaのコピーで、次のように読みました。
戻り値の型としてワイルドカード型を使用しないでください。
クライアントは返された をキャストする必要があるため、問題を理解していますType<?>
。ObliviousClass
しかし、上記のクライアント コードが機能しないため、ジェネリック型を作成したくありませんObliviousClass<T>
...
私がやろうとしていることのためのより良いデザインはありますか? -私の現在の解決策は、クライアントに静的メソッドを提供することです。次の行に沿ったもの:
public static <T> void getType(ObliviousClass instance, Key key, Type<T> dest){
dest = (Type<T>)instance.getType(key);
}
私はいろいろと調べましたが、私の混乱を完全に解消する答えを見つけることができませんでした.