HashMap <Class <?>, List <Class <? >>>: указать, что списки «классы расширяют ключи» - PullRequest
8 голосов
/ 18 ноября 2011

Один из моих классов должен хранить классы в соответствии с их суперклассами.Для этого я использую HashMap, где ключи - это суперклассы, а значения - список их расширенных классов.Итак, это выглядит так:

HashMap<Class<?>, List<Class<?>>>

Я хотел бы знать, была ли запись, позволяющая мне быть более точной, что-то вроде:

HashMap<Class<T>, List<Class<? extends T>>>

Я пробовал этои, конечно, это не работает: T не может быть решена.Есть ли синтаксис, который позволил бы мне сделать это?Заранее спасибо за помощь.

Ответы [ 2 ]

8 голосов
/ 18 ноября 2011

Вы можете сделать это с помощью методов доступа.

// only accessed by methods which check the keys and values are the right type.
final Map<Class, List<Class>> map = new LinkedHashMap<Class, List<Class>>();

public <T, S extends T> void add(Class<T> key, Class<S> value) {
    List<Class> list = map.get(key);
    if (list == null)
        map.put(key, list = new ArrayList<Class>());
    list.add(value);
}

public <T, S extends T> List<Class<S>>get(Class<T> key) {
    return (List<Class<S>>) map.get(key);
}

public <T, S extends T> boolean contains(Class<T> key, Class<S> value) {
    List<Class> list = map.get(key);
    if (list == null) return false;
    return list.contains(value);
}

public static void main(String... args) {
    Main m = new Main();
    m.add(Number.class, Integer.class); // compiles
    m.add(Number.class, String.class); // does not compile.
}
1 голос
/ 18 ноября 2011

Что-то вроде:

class MyMap<T extends Class<?>> extends HashMap<T, List<T>> {

}

Не полностью решит вашу проблему. Вы можете видеть, что для отдельных записей на карте она не может меняться.

...