诊断Java代码: 轻松掌握Java泛型类型,第2部分 - 编程入门网
码将生成警告: Warning: unchecked cast to type T :
清单 3. 带 unchecked 操作的泛型代码
您应该严肃地对待这些警告,因为它们说明您的代码在运行时会表现得非常奇怪。事实上,它们会使得诊断代码变得极为困难。在以前的代码中,我们认为如果对实例 C<JFrame> 调用 register("test") ,会发出 ClassCastException 。但并非如此;计算将继续,就仿佛数据类型转换成功了一样,然后在进一步进行计算时发出错误,或者更糟:用遭破坏的数据完成计算,但不向外发出任何错误信号。同样,对“外露”类型参数的 instanceof 检查将在编译时产生“unchecked”警告,而且检查将不会如期在运行时进行。 双刃剑 那么,这里到底发生了什么?因为 Tiger 依靠类型擦除,所以数据类型转换和 instanceof 测试中的外露类型参数被“擦除”为它们的上界(在前面的例子中,那将是类型 Object )。因此,对类型参数的数据类型转换将变成对参数上界的转换。 同样, instanceof 将检查操作数是否是参数界限的 instanceof 。那根本不是我们打算做的,如果是的话,我们完全可以显式地强制转换为界限。因此,通常应避免对类型参数使用数据类型转换和 instanceof 检查。 然而,有时为了编译代码,您必须依靠对类型参数的数据类型转换。如果是这样的情况,只要记住,在代码的那一部分中,类型检查不保险 ― 要靠自己。 尽管泛型类型是制作健壮代码的强大武器,但我们已经演示了误用它们会使代码不再健壮而且极难诊断和修正。下次,我们将介绍 Tiger 中泛型类型的后两个限制,并讨论试图在泛型 Java 类型系统中包括它们时必定会出现的一些问题。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |