2013-01-23 17 views
6

特定のサブクラスのキーからマップするマップを宣言することは可能ですか?特定のサブクラスの値を使用しますが、両方のクラスが同じ型パラメータを共有することを保証しますか?背景についてはJava:関連する2つのジェネリックでマップを宣言するタイプ(<T>マップ<Class <?extends ClassA <T>>、クラス<?extends ClassB >>

にClassAとClassBの両方が、私はにClassAとClassBのの実装からマップのみ「互換性」のペアを確保したい共通のリソース

public abstract class ClassA<T> { 
     public abstract T getResource() ; 
} 

public abstract class classB<T> { 
     public abstract void consoumeResource(T resource); 
} 

のための動作を実装するには、一緒に置くことができます1つのエントリで。

答えて

4

もう一つの方法は、あなた自身のMap実装を提供するだろう。そこには、既存の実装を拡張する場合に必要な多くのコードではありませんし、あなたの新しいタイプを使用します。

public class CompatibleHashMap<T> extends HashMap<ClassA<T>, ClassB<T>> { 

} 

CompatibleHashMap<String>だけあなたがキーと値としてClassB<String>としてClassA<String>を置くことができます。

EDIT:

あなたがあなたのコメントで述べたように、あなたはMap実装に自分を縛るされているこの方法。あなたは、次のような何かをすることによってこれを克服することができます

public class CompatibleMap<T> implements Map<ClassA<T>, ClassB<T>> { 

    private Map<ClassA<T>, ClassB<T>> map; 

    public CompatibleMap(Map<ClassA<T>, ClassB<T>> map) { 
     this.map = map; 
    } 

    @Override 
    public Set<List<T>> keySet() { 
     return map.keySet(); 
    } 
    // ... implement all other Map methods by calling the method on map. 
} 

あなたはその後、

CompatibleMap<String> map = new CompatibleMap<>(new HashMap<ClassA<String>, ClassB<String>>()); 

のように、この方法でそれをインスタンス化することができ、あなたが特定のMap実装に縛られず、コンパイラがスローされますmap,ClassAおよびClassBのジェネリックタイプが同じでない場合はエラーです。

+0

マップの具体的な実装とは対照的ですが、これは私が探していたものではありませんが、私が見ることができる最高のソリューションです。ありがとう。 – DThought

+0

@DThought:私の編集を参照してください。 – jlordo

4

マップ宣言ではこれを行うことはできませんが、マップにアクセス/更新するメソッドを使用して行うことができます。

private final Map<Class, Builder> builderMap = new LinkedHashMap<>(); 

public <T> void addBuilder(Class<T> tClass, Builder<T> tBuilder) { 
    builderMap.put(tClass, tBuilder); 
} 

public <T> Builder<T> getBuilderFor(Class<T> tClass) { 
    @SuppressWarnings("unchecked") 
    Builder<T> tBuilder = (Builder<T>) builderMap.get(tClass); 
    return tBuilder; 
} 
関連する問題

 関連する問題