通过reflection和使用Class.cast()
可能重复:
Java Class.cast()与强制转换运算符
我没有成功地试图找出Class.cast()
做什么或它可能有什么好处,同时我想知道我是否可以通过reflection以某种方式投射对象。
首先,我认为下面的行可能是错误的:
Object o = "A string"; String str = Class.forName("java.lang.String").cast(object);
但如果没有明确的演员,它就行不通。
那么什么是Class
类的cast
方法呢? 它是否有可能只是通过reflection来投射对象,所以你找到对象的类,在它上面使用Class.forName
并以某种方式投射它?
一个例子在哪里工作:
class Favorites { private Map, Object> map = new HashMap, Object>(); public T get(Class clazz) { return clazz.cast(map.get(clazz)); } public void put(Class 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);
是安全的。 因此它要求显式转换。
Class.forName
的返回类型是Class extends Object>
Class extends Object>
。 你想要Class extends String>
例如,使用String.class
Class extends String>
。
String str = String.class.cast(object);
在您开始使用某种接口类型替换String
之前,这不是很有用。
无论如何,反思通常是邪恶的。
Class.forName
将返回Class>
类型对象。 cast
方法将返回Class的类型参数。 因此,在这种情况下它会返回一个? (对象)类型对象。
你应该试试:
Class strClass = (Class ) Class.forName("java.lang.String"); String str = strClass.cast(object);
另请参见Class.cast()
您可以避免警告,例如使用以下代码:
public T getObject(Class type){ Object o = getSomeObject(); if (type.isInstance(o)){ return type.cast(o); } else { return null; } }
而以下代码将引发警告:
public T getObject(){ return (T) getSomeObject(); }