绝对没有理由写Foo.class.cast(o)
,就相当于(Foo)o
。
一般来说, ifX
是可具体化的类型,并且Class<X> clazz
, thenclazz.cast(o)
与 相同(X)o
。
如果所有类型都是可具体化的,则方法Class.cast()
因此是多余且无用的。
不幸的是,由于当前版本的 Java 中的擦除,并非所有类型都是可具体化的。例如,类型变量是不可具体化的。
ifT
是一个类型变量, cast(T)o
是未检查的,因为在运行时,JVM 不知道 的确切类型T
,JVM 无法测试 ifo
是否真的是 type T
。演员可能被错误地允许,这可能会在以后引发问题。
这不是一个大问题。通常,当程序员这样做时(T)o
,他已经推断出强制转换是安全的,并且不会在运行时引起任何问题。演员表由应用程序逻辑检查。
假设 aClass<T> clazz
在强制转换时可用,那么我们确实知道T
运行时是什么;我们可以添加额外的运行时检查以确保o
确实是T
.
check clazz.isInstance(o);
(T)o;
这基本上就是Class.cast()
这样做的。
我们永远不会期望强制转换在任何情况下都会失败,因此在正确实现的应用程序中,检查clazz.isInstance(o)
必须始终成功,因此clazz.cast(o)
相当于(T)o
- 再次假设代码是正确的。
如果可以证明代码是正确的并且演员表是安全的,那么出于性能原因可能会更(T)o
喜欢。clazz.cast(o)
在另一个答案中提出的示例中MutableClassToInstanceMap
,我们可以清楚地看到强制转换是安全的,因此简单(T)o
就足够了。