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

发布于 2024-12-27 20:51:16 字数 542 浏览 2 评论 0原文

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

我没有成功地尝试找到了解 Class.cast() 的作用或它可能有什么用处。同时我想知道是否可以通过反射以某种方式投射对象。

首先,我认为类似下面的代码可能会起作用:

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

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

那么Class类的cast方法有什么用呢?是否可以通过反射来强制转换对象,以便找到对象的类,在其上使用 Class.forName 并以某种方式强制转换它?

Possible Duplicate:
Java Class.cast() vs. cast operator

I am unsuccessfully trying to find out what Class.cast() does or what it may be good for. At the same time I am wondering whether I can somehow cast an object via reflection.

First I thought something like the lines below might work:

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

But without an explicit cast it does not work.

So what is the cast method of Class class good for? And is it somehow possible just with reflection to cast objects, so you find the object's class, use Class.forName on it and cast it somehow?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

请止步禁区 2025-01-03 20:51:16

一个例子,它可以工作:

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

安全。因此它要求显式强制转换。

An example where is does work:

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

which allows you to write:

Favorites favs = new Favorites();
favs.put(String.class, "Hello");
String favoriteString = favs.get(String.class);

The reason your code doesn't work is that Class.forName() returns a Class<?>, i.e. a class object representing an unknown type. While the compiler could possibly infer the type in your example, it can not in general. Consider:

Class.forName(new BufferedReader(System.in).readLine())

what's the type of this expression? Clearly the compiler cannot know what the class name will be at runtime, so it doesn't know whether

String s = Class.forName(new BufferedReader(System.in).readLine()).cast(o);

is safe. Therefore it requests an explicit cast.

深巷少女 2025-01-03 20:51:16

Class.forName 的返回类型将为 Class。你想要Class<?扩展 String>,例如使用 String.class

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

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

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

The return type of Class.forName will be Class<? extends Object>. You want Class<? extends String>, for instance using String.class.

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

Not very useful, until you start replacing String with some kind of interface type.

In any case, reflection is generally evil.

不必在意 2025-01-03 20:51:16

您可以使用以下代码来避免警告:

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

You can avoid a warning e.g. with the following code:

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

while the following code will raise a warning:

public <T> T getObject(){
  return (T) getSomeObject();
}
你好,陌生人 2025-01-03 20:51:16

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

您应该尝试:

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

另请参阅 Class.cast()

Class.forName will return a Class<?> type object. The cast method will return the type parameter of Class. Thus, in this case it'll return a ? (Object) type object.

You should try:

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

See also Class.cast()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文