我最近偶然发现了一段代码,它是这样的:
Object o = .. ;
Foo foo = Foo.class.cast(o);实际上,我甚至不知道java.lang.Class有一个强制转换方法,所以我查看了文档,从我收集到的信息来看,这只是对类对象所表示的类进行了强制转换。因此,上面的代码大致相当于
Object o = ..;
Foo foo = (Foo)o;所以我想知道,为什么我想要使用强制转换方法,而不是简单地使用“旧方法”进行强制转换。有没有一个很好的例子,说明使用强制转换方法比使用简单的强制转换方法更有好处?
发布于 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。
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就足够了。
https://stackoverflow.com/questions/7900410
复制相似问题