Jar*_*rek 24 java reflection casting
我没有成功地试图找出做Class.cast()什么或做什么有什么好处,同时我想知道我是否能以某种方式通过反射投射对象.
首先,我认为下面的行可能是错误的:
Object o = "A string";
String str = Class.forName("java.lang.String").cast(object);
Run Code Online (Sandbox Code Playgroud)
但如果没有明确的演员,它就行不通.
那么什么是上课cast方法Class呢?它是否有可能只是通过反射来投射对象,所以你找到对象的类,使用Class.forName它并以某种方式投射它?
mer*_*ike 29
一个例子在哪里工作:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
它允许你写:
Favorites favs = new Favorites();
favs.put(String.class, "Hello");
String favoriteString = favs.get(String.class);
Run Code Online (Sandbox Code Playgroud)
您的代码不起作用的原因是Class.forName()返回一个Class<?>,即表示未知类型的类对象.虽然编译器可能在您的示例中推断出类型,但通常情况下不能.考虑:
Class.forName(new BufferedReader(System.in).readLine())
Run Code Online (Sandbox Code Playgroud)
这个表达的类型是什么?很明显,编译器无法知道运行时类名是什么,因此它不知道是否
String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);
Run Code Online (Sandbox Code Playgroud)
是安全的.因此它要求显式转换.
返回类型Class.forName将是Class<? extends Object>.你想要Class<? extends String>,例如使用String.class.
String str = String.class.cast(object);
Run Code Online (Sandbox Code Playgroud)
不太有用,直到你开始用String某种接口类型替换.
无论如何,反思通常是邪恶的.
| 归档时间: |
|
| 查看次数: |
68111 次 |
| 最近记录: |