4
public abstract class Mother {
}

public class Daughter extends Mother {
}

public class Son extends Mother {
}

MapどのキーがDaughterまたはSonクラスの1つであり、どの値がこれら2つのクラスのいずれかのオブジェクトのリストである必要があります

例えば:

/* 1. */ map.put(Daughter.class, new ArrayList<Daughter>()); // should compile
/* 2. */ map.put(Son.class, new ArrayList<Son>()); // should compile
/* 3. */ map.put(Daughter.class, new ArrayList<Son>()); // should not compile
/* 4. */ map.put(Son.class, new ArrayList<Daughter>()); // should not compile

試しMap<Class<T extends Mother>, List<T>>ましたが、コンパイルされません。

Map<Class<? extends Mother>, List<? extends Mother>>コンパイルしますが、ケース3.4.コンパイルも行いますが、そうではありません。

それも可能ですか?

4

2 に答える 2

9

これをタイプでエンコードすることはできないと思います。カスタムクラスでエンコードします。

class ClassMap<T> {
  private Map<Class<? extends T>, List<? extends T>> backingMap = new HashMap<>();

  public <E extends T> void put(Class<E> cls, List<E> value) {
    backingMap.put(cls, value);
  }

  @SuppressWarnings("unchecked")
  public <E extends T> List<E> get(Class<E> cls) {
    return (List<E>)backingMap.get(cls);
  }
}

backingMapこのクラスの外部に参照を漏らさない限り、ここで警告を抑制しても安全です。

于 2012-12-12T17:47:16.720 に答える
0

単一のマップを探していると仮定すると、これは不可能です。

于 2012-12-12T17:46:08.313 に答える