通过反射和使用 Class.cast() 进行转换

2022-09-01 12:58:23

可能的重复:
Java Class.cast() vs. cast 运算符

我试图找出什么或它可能有什么好处,但没有成功。同时,我想知道我是否可以通过反射以某种方式投射物体。Class.cast()

首先,我认为像下面几行这样的东西可能会起作用:

Object o = "A string";
String str = Class.forName("java.lang.String").cast(object);

但是没有明确的投射,它就不起作用。

那么上课的方法有什么好处呢?是否有可能仅仅通过反射来投射对象,所以你找到对象的类,使用它并以某种方式投射它?castClassClass.forName


答案 1

一个示例,其中 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);

很安全。因此,它请求显式强制转换。


答案 2

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

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

不是很有用,直到你开始用某种接口类型替换。String

无论如何,反射通常是邪恶的。