Java 通过反射和使用Class.Cast()进行强制转换
可能重复:Java 通过反射和使用Class.Cast()进行强制转换,java,reflection,casting,Java,Reflection,Casting,可能重复: 我试图找出Class.cast()做什么或它可能有什么好处,但没有成功,同时我想知道是否可以通过反射以某种方式投射对象 首先,我认为下面这句话可能是错误的: Object o = "A string"; String str = Class.forName("java.lang.String").cast(object); 但如果没有明确的强制转换,它就不起作用 那么cast的Class方法有什么好处呢?仅仅通过反射就可以投射对象吗?因此,您可以找到对象的类,在其上使用class
我试图找出
Class.cast()
做什么或它可能有什么好处,但没有成功,同时我想知道是否可以通过反射以某种方式投射对象
首先,我认为下面这句话可能是错误的:
Object o = "A string";
String str = Class.forName("java.lang.String").cast(object);
但如果没有明确的强制转换,它就不起作用
那么
cast
的Class
方法有什么好处呢?仅仅通过反射就可以投射对象吗?因此,您可以找到对象的类,在其上使用class.forName
并以某种方式投射它?类的返回类型。forName将是类类。forName
将返回类类型的对象。cast
方法将返回类的类型参数。因此,在这种情况下,它将返回一个?(对象)类型对象
你应该试试:
Class<String> strClass = (Class<String>) Class.forName("java.lang.String");
String str = strClass.cast(object);
Class strClass=(Class)Class.forName(“java.lang.String”);
字符串str=strClass.cast(对象);
另请参见您可以避免警告,例如使用以下代码:
public <T> T getObject(Class<T> type){
Object o = getSomeObject();
if (type.isInstance(o)){
return type.cast(o);
} else {
return null;
}
}
public T getObject(类类型){
对象o=getSomeObject();
if(类型isInstance(o)){
返回类型.cast(o);
}否则{
返回null;
}
}
而以下代码将发出警告:
public <T> T getObject(){
return (T) getSomeObject();
}
public T getObject(){
返回(T)getSomeObject();
}
一个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);
}
}
代码无法工作的原因是Class.forName()返回一个类
,即表示未知类型的类对象。虽然编译器可能在您的示例中推断出类型,但通常不能。考虑:
Class.forName(new BufferedReader(System.in).readLine())
这个表达式是什么类型的?显然,编译器无法知道在运行时类名是什么,因此它不知道
String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);
这是安全的。因此,它需要一个明确的演员阵容。如果没有思考,我们中的任何人都不会在Java发明17年后仍在讨论它。@staffman好吧,我肯定会有一份更小的工作。(哦,在fcs(没有反射)17年后)有一个很好的解释:[[1]:ClassThat很好,我没有意识到。如果Class.cast(object)的返回类型也是一个应该反映的类,我如何将对象投射到它?有人能举一个使用第一个getObject方法的例子吗?谢谢。
Class.forName(new BufferedReader(System.in).readLine())
String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);