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

Jar*_*rek 24 java reflection casting

可能重复:
Java Class.cast()与强制转换运算符

我没有成功地试图找出做Class.cast()什么或做什么有什么好处,同时我想知道我是否能以某种方式通过反射投射对象.

首先,我认为下面的行可能是错误的:

Object o = "A string";
String str = Class.forName("java.lang.String").cast(object);
Run Code Online (Sandbox Code Playgroud)

但如果没有明确的演员,它就行不通.

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

mer*_*ike 29

一个例子在哪里工作:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它允许你写:

Favorites favs = new Favorites();
favs.put(String.class, "Hello");
String favoriteString = favs.get(String.class);
Run Code Online (Sandbox Code Playgroud)

您的代码不起作用的原因是Class.forName()返回一个Class<?>,即表示未知类型的类对象.虽然编译器可能在您的示例中推断出类型,但通常情况下不能.考虑:

Class.forName(new BufferedReader(System.in).readLine())
Run Code Online (Sandbox Code Playgroud)

这个表达的类型是什么?很明显,编译器无法知道运行时类名是什么,因此它不知道是否

String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);
Run Code Online (Sandbox Code Playgroud)

是安全的.因此它要求显式转换.


Tom*_*ine 5

返回类型Class.forName将是Class<? extends Object>.你想要Class<? extends String>,例如使用String.class.

String str = String.class.cast(object);
Run Code Online (Sandbox Code Playgroud)

不太有用,直到你开始用String某种接口类型替换.

无论如何,反思通常是邪恶的.

  • 如果没有反思,我们在发明Java 17年后仍然不会讨论Java. (4认同)