诊断Java代码: 轻松掌握Java泛型典范,第2部份[Java编程]
本文“诊断Java代码: 轻松掌握Java泛型典范,第2部份[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
J2SE 1.5 ― 代号为“Tiger” ― 筹划在 2003 年年底公布,它将包含泛型范例(如在 JSR-14 原型编译器中预先展示的那样,目前可下载得到).在 第 1 部份中,我们谈论了泛型范例的底子知识,以及为什么它们是对 Java 语言的一个重要且急迫需求的增补.我们还阐明了为 Tiger 拟定的泛型范例的实现怎么会包含数个“缺陷”,这些缺陷限制了可以利用泛型范例的上下文.
为了帮忙新程序员有效地利用泛型范例,我将具体阐明到底泛型范例的哪些用法在 Tiger 和 JSR-14 中是被禁止的,并将阐明为什么这些限制是 JSR-14(理所当然还有 Tiger)为了在 JVM 上兼容地实现泛型范例所利用的实现战略的必定后果.
泛型范例的限制
让我们先查阅一下 Tiger 和 JSR-14 中泛型范例的利用限制:
不该在静态成员中引用封闭范例参数.
不能用基本范例实例化泛型范例参数.
不能在数据范例转换或 instanceof 操作中利用“外露”范例参数.
不能在 new 操作中利用“外露”范例参数.
不能在类定义的 implements 或 extends 子句中利用“外露”范例参数.
为什么会有这些限制呢?这要归因于 Tiger 和 JSR-14 为在 JVM 上实现泛型范例所利用的机制.由于 JVM 根本不支持泛型范例,所以这些编译器“耍了个把戏”,使得仿佛存在对泛型范例的支持 ― 它们用泛型范例信息查抄全部的代码,但随即“擦除”全部的泛型范例并生成只包含普通范例的类文件.
比方,将象 List<T> 这样的泛型范例擦除得只剩下 List .“外露”范例参数 ― 单独呈现而不是位于某个范例中的范例参数(如类 List<T> 中的范例参数 T )― 被简单地擦除成它们的上界(就 T 而言,其上界就是 Object ).
这一技术的功效极端强盛;我们可以使几近全部泛型范例的精度得到加强,但又与 JVM 保持兼容.事实上,我们乃至可以交替地利用非泛型的旧类(比方 List )和其对应的泛型类( List<T> );二者在运行时看起来是一样的.
遗憾的是,正如以上的限制所示,得到这一功效是有代价的.以这种方法举行擦除在范例系统中引入了缺陷,这些缺陷限制我们利用泛型范例的安全性.
为了帮忙阐明每种限制,我们查阅会呈现这些限制的示例.在本文中,我们将谈论前三个限制.与后两个限制有关的问题过于复杂,因而需求更深化的研究,留待下一篇文章谈论.
静态成员中的封闭范例参数
编译器完好禁止在静态办法和静态内部类中引用封闭范例参数.所以,举例来说,以下代码在 Tiger 中就是不法的:
清单 1. 在静态上下文中不法引用封闭范例参数
class C<T> {
static void m() {
T t;
}
static class D {
C<T> t;
}
}
以上是“诊断Java代码: 轻松掌握Java泛型典范,第2部份[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |