通过反射和使用 Class.cast() 进行投射[重复]

2024-01-01

可能的重复:
Java Class.cast() 与强制转换运算符 https://stackoverflow.com/questions/1555326/java-class-cast-vs-cast-operator

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

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

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

但如果没有明确的强制转换,它就不起作用。

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


一个有效的例子:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过反射和使用 Class.cast() 进行投射[重复] 的相关文章

随机推荐

  • 如何对 Visual3D 或 UIElement3D 等 3D 元素使用数据绑定

    我的视图模型中有一堆项目 我将使用 Viewport3D 以 3D 形式渲染它们 UI 的相关部分定义如下
  • 如何将本地裸仓库导入到Gogs中?

    我的主机上有一些裸露的 Git 存储库 后来我在同一台主机上安装了 Gogs 我将其配置为使用完全相同的文件夹来存储存储库 我的裸存储库已经驻留在其中 我怎样才能导入它们 事实上我不需要 导入 任何东西 我只是想让Gogs认识到他们的存在
  • 我可以在Scheme 的过程内部定义一个全局变量吗?

    我有一种情况 我想做一些类似的事情 define def a b store a b store the definition of a somewhere define global a b also define a so that i
  • 获取 php 数组中的下一个值

    我想获取 PHP 数组中的下一个值 例如 array array a b c d e f current array val c so I want to run a code to get the next value in the ar
  • chrome 取消了经典的头像菜单吗?

    与许多 Web 开发人员一样 我在 Google Chrome 中维护大量配置文件 以便测试 Web 应用程序 在进行这些测试时 必须快速确定与 Chrome 交互时我所处的配置文件 我依靠经典的 Chrome 头像菜单来指示当前的个人资料
  • 尝试在 infile.open() 中使用字符串变量在 C++ 中被视为 char

    我正在尝试制作一个程序 其中用户输入文件名 然后程序尝试打开它并检查它是否已打开 我正在使用 getline 函数 到目前为止 这是我的代码 include
  • PHP md5 解释

    我正在开发这个 PHP 项目 并且有很多地方使用了 md5 我什至已经使用过它很多次了 但直到今天我仍然不清楚这个功能是做什么的 我意识到它会解密传入的值 但是如何撤消它以使其恢复到原始值 也许我不清楚整个过程 如果有人有有关该过程的信息
  • 如何使用 Iphone 应用程序获取设备令牌以及有关设备的其他信息?

    在我的 iPhone 应用程序中 我想要使用 APN 的设备令牌 如何使用代码获得它 另外 我想要有关设备用户 其版本和其他信息的其他信息 如何使用代码获得它 是否可以使用Device Token获取设备的其他信息 设备令牌的格式是什么 请
  • 在 UIViewController 的主视图中加载自定义 UIView

    我对 UIView 进行了子类化并创建了一个 NIB 来控制应用程序的主要逻辑 希望视图能够很好地缩放 我想将它用于该应用程序的 iPhone 和 iPad 版本 在 iPhone 上 视图将覆盖全屏 在 iPad 上 视图将仅覆盖屏幕的一
  • 用于验证的 OO 设计模式

    我正在根据这些假设编写一些验证代码 Validation code must be in an external class 即没有数据类包含它自己的验证 The same object can be validated in differ
  • group by 中的 group by 和average

    我有一个像这样的数据框 cluster org time 1 a 8 1 a 6 2 h 34 1 c 23 2 d 74 3 w 6 我想计算每个集群每个组织的平均时间 预期结果 cluster mean time 1 15 8 6 2
  • WCF:远程服务器返回错误:(413)请求实体太大[重复]

    这个问题在这里已经有答案了 我有一个wcf服务 有一种方法可以获取base64字符串来上传文件我的文件大小为100kb 随着时间的推移它可能会更大 我收到错误消息 远程服务器返回错误 413 请求实体太大 同时尝试获取 HttpWebRes
  • 使用 ifelse 从 R 数据集中删除不需要的行

    我有一个数据集 我想删除我的几个人在第一个观察年中第 11 个月出现的情况 是否可以用 if else 来做到这一点 就像是 ifelse ID 1 Month 11 and Year 2006 remove these rows ifel
  • OS X Lion 上的 Eclipse Indigo 输入延迟

    我正在做一个相当大的项目 最近遇到了我的 90 年代的好老朋友 打字滞后 我的设置是配备 SSD 驱动器的 MacBook Pro 2 2 GHz i7 8GB 到目前为止还没有出现任何严重的性能问题 我已将内存分配增加到 Xmx1024m
  • Bootstrap,对布局进行响应式更改

    我在设计中使用了流畅的 Twitter Bootstrap 布局 并将使其具有响应能力 考虑这样的网格 div class row fluid div class span4 div div class span8 div div 隐藏 s
  • firebase 库实现出现 Appcompat 错误

    您好 我有一个关于添加 firebase 依赖项的小问题 当我添加这一行时 implementation com google firebase firebase core 17 0 0 在我的 build gradle 中 我看到一条错误
  • 如何在 Windows Phone 8.1 中添加 AppBar

    在Windows Phone 8中 添加应用程序栏并管理它非常容易 但现在我测试新的Windows Phone 8 1 SDK来构建具有新地理围栏功能的项目 但我不知道如何在应用程序中添加应用程序栏 在Windows Phone 8 1中
  • 如何使用另一个测试结果中的标签来标记 ggplot 中的条形图?

    我想用测试的标签输出来标记我的图 例如 使用 agricolae 库中的 LSD test 进行 LSD 测试输出 a b ab 等 这是运行的示例 library ggplot2 library agricolae wt lt gl 3
  • 根据用户选择将 MYSQL 表中的数据输出为 HTML 表单

    我有一个 MYSQL 表 roomcost 用于保存租用房间的成本 costID Room Cost 1 room1 15 2 room2 30 3 room3 50 rsRoomCost SQL 是 SELECT FROM roomcos
  • 通过反射和使用 Class.cast() 进行投射[重复]

    这个问题在这里已经有答案了 可能的重复 Java Class cast 与强制转换运算符 https stackoverflow com questions 1555326 java class cast vs cast operator