不,这是不可能的。您甚至无法List<String>.class
在代码中引用 - 它会导致编译错误。对于 ,只有一个类对象List
,它被称为List.class
。
由于运行时类型擦除,这是不可能的吗?
正确的。
顺便说一句,这是泛型类型,而不是带注释的类型。
更新
再想一想,您可以通过稍微调整 Josh Bloch 的类型安全异构容器(在Effective Java 2nd Ed.,Item 29 中发布)来获得与上面的 Map 相当接近的东西:
public class Lists {
private Map<Class<?>, List<?>> lists =
new HashMap<Class<?>, List<?>>();
public <T> void putList(Class<T> type, List<T> list) {
if (type == null)
throw new NullPointerException("Type is null");
lists.put(type, list);
}
public <T> List<T> getList(Class<T> type) {
return (List<T>)lists.get(type);
}
}
演员表getList
未经检查,发出警告,但恐怕我们无法避免。但是,我们知道为 class 存储的值X
必须是 a List<X>
,因为这是由编译器保证的。所以我认为演员阵容是安全的(如果你遵守规则,也就是说 - 即永远不要putList
使用普通的非泛型Class
参数调用),因此可以使用@SuppressWarnings("unchecked")
.
你可以像这样使用它:
Lists lists = new Lists();
List<Integer> integerList = new ArrayList<Integer>();
List<String> stringList = new ArrayList<String>();
...
lists.putList(Integer.class, integerList);
lists.putList(String.class, stringList);
List<Integer> storedList = lists.getList(Integer.class);
assertTrue(storedList == integerList);