首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过反射和使用Class.cast()进行强制转换

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

Stack Overflow用户
提问于 2012-01-19 06:37:03
回答 4查看 80.2K关注 0票数 28

可能重复:

Java Class.cast() vs. cast operator

我试图找出Class.cast()是做什么的,或者它可能有什么好处,但没有成功。同时,我想知道我是否可以通过反射来强制转换对象。

首先,我想像下面这样的代码行得通:

代码语言:javascript
复制
Object o = "A string";
String str = Class.forName("java.lang.String").cast(object);

但是如果没有显式的强制转换,它就不会工作。

那么Class类的cast方法有什么用呢?有没有可能仅仅通过反射来转换对象,所以你可以找到对象的类,对它使用Class.forName,然后以某种方式转换它?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-19 08:07:21

下面是一个可以工作的示例:

代码语言:javascript
复制
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);
    }
}

它允许您编写以下代码:

代码语言:javascript
复制
Favorites favs = new Favorites();
favs.put(String.class, "Hello");
String favoriteString = favs.get(String.class);

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

代码语言:javascript
复制
Class.forName(new BufferedReader(System.in).readLine())

这个表达式的类型是什么?显然,编译器不能知道运行时的类名是什么,所以它不知道

代码语言:javascript
复制
String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);

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

票数 36
EN

Stack Overflow用户

发布于 2012-01-19 06:40:34

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

代码语言:javascript
复制
String str = String.class.cast(object);

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

在任何情况下,反射通常都是邪恶的。

票数 5
EN

Stack Overflow用户

发布于 2012-01-19 06:43:50

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

您应该尝试:

代码语言:javascript
复制
Class<String> strClass = (Class<String>) Class.forName("java.lang.String");
String str = strClass.cast(object);

另请参阅Class.cast()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8918550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档