绝对没有理由写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就足够了。