通过reflection和使用Class.cast()

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

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

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

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

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

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

一个例子在哪里工作:

 class Favorites { private Map, Object> map = new HashMap, Object>(); public  T get(Class clazz) { return clazz.cast(map.get(clazz)); } public  void put(Class 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); 

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

Class.forName的返回类型是Class Class 。 你想要Class 例如,使用String.class Class

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

在您开始使用某种接口类型替换String之前,这不是很有用。

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

Class.forName将返回Class类型对象。 cast方法将返回Class的类型参数。 因此,在这种情况下它会返回一个? (对象)类型对象。

你应该试试:

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

另请参见Class.cast()

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

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

而以下代码将引发警告:

 public  T getObject(){ return (T) getSomeObject(); }