首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我为什么要使用java.lang.Class.cast

我为什么要使用java.lang.Class.cast
EN

Stack Overflow用户
提问于 2011-10-26 16:38:20
回答 8查看 4.4K关注 0票数 20

我最近偶然发现了一段代码,它是这样的:

代码语言:javascript
运行
复制
Object o = .. ;
Foo foo = Foo.class.cast(o);

实际上,我甚至不知道java.lang.Class有一个强制转换方法,所以我查看了文档,从我收集到的信息来看,这只是对类对象所表示的类进行了强制转换。因此,上面的代码大致相当于

代码语言:javascript
运行
复制
Object o = ..;
Foo foo = (Foo)o;

所以我想知道,为什么我想要使用强制转换方法,而不是简单地使用“旧方法”进行强制转换。有没有一个很好的例子,说明使用强制转换方法比使用简单的强制转换方法更有好处?

EN

Stack Overflow用户

发布于 2011-10-26 19:36:58

完全没有理由写Foo.class.cast(o),它等同于(Foo)o

一般来说,如果X是一个可实现的类型,并且是Class<X> clazz,那么clazz.cast(o)(X)o是相同的。

如果所有类型都是可重构的,那么Class.cast()方法就是多余的,也是无用的。

不幸的是,由于Java当前版本中的擦除,并不是所有类型都是可重构的。例如,类型变量是不可重用的。

如果T是一个类型变量,则不选中强制转换(T)o,因为在运行时,T的确切类型对于JVM是未知的,JVM无法测试o是否真的是T类型。强制转换可能会被错误地允许,这可能会在以后引发问题。

这不是一个大问题;通常当程序员执行(T)o时,他已经推断强制转换是安全的,并且在运行时不会造成任何问题。强制转换由应用程序逻辑检查。

假设Class<T> clazz在强制转换时可用,那么我们确实知道T在运行时是什么;我们可以添加额外的运行时检查,以确保o确实是一个T

代码语言:javascript
运行
复制
check clazz.isInstance(o);
(T)o;

这基本上就是Class.cast()所做的。

我们永远不会期望强制转换在任何情况下都会失败,因此在一个正确实现的应用程序中,check clazz.isInstance(o)必须以某种方式成功,因此clazz.cast(o)等同于(T)o -再一次,假设代码是正确的。

如果可以证明代码是正确的,类型转换是安全的,那么出于性能原因,人们可能会更喜欢(T)o而不是clazz.cast(o)。在另一个答案中提出的MutableClassToInstanceMap示例中,我们可以明显地看到强制转换是安全的,因此简单的(T)o就足够了。

票数 2
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7900410

复制
相关文章

相似问题

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