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);