一个示例,其中 is 确实有效:
class Favorites {
private Map<Class<?>, Object> map = new HashMap<Class<?>, Object>();
public <T> T get(Class<T> clazz) {
return clazz.cast(map.get(clazz));
}
public <T> void put(Class<T> clazz, T favorite) {
map.put(clazz, favorite);
}
}
它允许您编写:
Favorites favs = new Favorites();
favs.put(String.class, "Hello");
String favoriteString = favs.get(String.class);
你的代码不起作用的原因是 Class.forName() 返回一个 ,即一个表示未知类型的类对象。虽然编译器可能会在您的示例中推断出类型,但通常不能。考虑:Class<?>
Class.forName(new BufferedReader(System.in).readLine())
这个表达式的类型是什么?显然,编译器在运行时无法知道类名是什么,因此它不知道是否
String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);
很安全。因此,它请求显式强制转换。