java 通过反射和使用Class.cast()进行强制转换[复制]

shyt4zoc  于 2023-06-20  发布在  Java
关注(0)|答案(4)|浏览(101)

此问题已在此处有答案

11年前关闭。

可能重复:

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,然后以某种方式强制转换它?

5m1hhzi4

5m1hhzi41#

下面是一个使用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);
    }
}

它允许你写:

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

是安全的。因此它请求显式强制转换。

bbuxkriu

bbuxkriu2#

Class.forName的返回类型将是Class<? extends Object>。您需要Class<? extends String>,例如使用String.class

String str = String.class.cast(object);

不是很有用,直到您开始用某种接口类型替换String
在任何情况下,反思通常都是邪恶的。

abithluo

abithluo3#

您可以避免警告,例如:代码如下:

public <T> T getObject(Class<T> type){
  Object o = getSomeObject();
  if (type.isInstance(o)){
     return type.cast(o);
  } else {
     return null;
  }
}

而下面的代码将发出警告:

public <T> T getObject(){
  return (T) getSomeObject();
}
nzk0hqpo

nzk0hqpo4#

Class.forName将返回Class<?>类型的对象。cast方法将返回Class的类型参数。因此,在这种情况下,它会返回一个?(Object)类型对象。
你应该尝试:

Class<String> strClass = (Class<String>) Class.forName("java.lang.String");
String str = strClass.cast(object);

Class.cast()

相关问题