可能重复:
Java Class.cast() vs. cast operator
我试图找出Class.cast()
是做什么的,或者它可能有什么好处,但没有成功。同时,我想知道我是否可以通过反射来强制转换对象。
首先,我想像下面这样的代码行得通:
Object o = "A string";
String str = Class.forName("java.lang.String").cast(object);
但是如果没有显式的强制转换,它就不会工作。
那么Class
类的cast
方法有什么用呢?有没有可能仅仅通过反射来转换对象,所以你可以找到对象的类,对它使用Class.forName
,然后以某种方式转换它?
发布于 2012-01-19 08:07:21
下面是一个可以工作的示例:
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);
是安全的。因此,它请求显式强制转换。
发布于 2012-01-19 06:40:34
Class.forName
的返回类型将是Class<? extends Object>
。你想要Class<? extends String>
,比如使用String.class
。
String str = String.class.cast(object);
在您开始用某种接口类型替换String
之前,它并不是很有用。
在任何情况下,反射通常都是邪恶的。
发布于 2012-01-19 06:43:50
Class.forName
将返回一个Class<?>
类型的对象。cast
方法将返回类的类型参数。因此,在这种情况下,它将返回一个?(对象)类型对象。
您应该尝试:
Class<String> strClass = (Class<String>) Class.forName("java.lang.String");
String str = strClass.cast(object);
另请参阅Class.cast()
https://stackoverflow.com/questions/8918550
复制相似问题