我的一个班级需要根据他们的超类来存储课程。为此,我使用的是HashMap,其中键是超类,并且值为其扩展类的列表。所以它看起来像是:
HashMap<Class<?>, List<Class<?>>>
我想知道是否有一个符号允许我更精确,例如:
HashMap<Class<T>, List<Class<? extends T>>>
我已经尝试过了,当然,它不起作用:T无法解决。是否有允许我这样做的语法?在此先感谢您的帮助。
答案 0 :(得分: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.
}
答案 1 :(得分:1)
类似的东西:
class MyMap<T extends Class<?>> extends HashMap<T, List<T>> {
}
不会完全解决您的问题。您可以看到地图上的单个条目无法改变。