6

特定のサブクラスのキーから特定のサブクラスの値にマップするマップを宣言することは可能ですか?ただし、両方のクラスが同じTypeパラメーターを共有することを保証しますか?

背景について:

ClassAとClassBの両方が、共通リソースの動作を実装します

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

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

ClassAとClassBの実装からマッピングし、「互換性のある」ペアのみを1つのエントリにまとめることができるようにします。

4

2 に答える 2

5

別の方法は、独自のMap実装を提供することです。既存の実装を拡張し、新しいタイプを使用する場合、必要なコードはそれほど多くありません。

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

}

今では、キーと値としてCompatibleHashMap<String>のみ置くことができます。ClassA<String>ClassB<String>

編集:

コメントで述べたように、この方法で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ジェネリック型が同じでない場合、コンパイラはエラーをスローします。mapClassAClassB

于 2013-01-23T10:15:21.300 に答える
4

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

例えば

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;
}
于 2013-01-23T10:09:55.820 に答える