HashMap <Class <?>,List <Class <?>>>:指定列表的类扩展键'

Rav*_*ine 8 java generics hashmap

我的一个班级需要根据他们的超类来存储类.为此,我使用的是HashMap,其中键是超类,并且值为其扩展类的列表.所以看起来像这样:

HashMap<Class<?>, List<Class<?>>>
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个符号允许我更精确,例如:

HashMap<Class<T>, List<Class<? extends T>>>
Run Code Online (Sandbox Code Playgroud)

我试过了,当然,它不起作用:T无法解决.是否有允许我这样做的语法?在此先感谢您的帮助.

Pet*_*rey 8

您可以使用访问器方法执行此操作.

// 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.
}
Run Code Online (Sandbox Code Playgroud)

  • +1.但请注意m.add(Number.class,Number.class); 也编译. (2认同)