诊断 Java 代码: 轻松掌握 Java 泛型,第 3 部分
http://tech.ddvip.com 2008年09月04日 社区交流
内容摘要:Java 开发人员和研究员 Eric Allen 继续讨论 JSR-14 和 Tiger 中的泛型类型,并着眼于在泛型类型中添加 naked 类型参数的 new 操作支持这一分支。
这一系列主要讨论在 Java 编程中添加泛型类型,本文是其中的一篇,将研究还未讨论过的有关使用泛型的两个限制之一,即添加对裸类型参数的 new 操作的支持(如类 C<T> 中的 new T() )。
正如我 上个月所提到的那样,Tiger 和 JSR-14 通过使用“类型消除(type erasure)”对 Java 语言实现泛型类型。使用类型消除(type erasure),泛型类型仅用于类型检查;然后,用它们的上界替换它们。由此定义可知:消除将与如 new T() 之类的表达式冲突。
如果假定 T 的界限是 Object ,那么这一表达式将被消除为 new Object() ,并且不管对 T 如何实例化( String 、 List 、 URLClassLoader 等等), new 操作将产生一个新的 Object 实例。显然,这不是我们想要的。
要添加对表达式(如 new T() )的支持,以及添加对我们上次讨论过的其它与类型相关的操作(如数据类型转换和 instanceof 表达式)的支持,我们必须采用某种实现策略而不是类型消除(如对于每个泛型实例化,使用独立的类)。但对于 new 操作,需要处理其它问题。
尤其是,为了实现对 Java 语言添加这种支持,必须对许多基本的语言设计问题作出决定。
有效的构造函数调用
首先,为了对类型参数构造合法的 new 表达式(如 new T() ),必须确保我们调用的构造函数对于 T 的每个实例化都有效。但由于我们只知道 T 是其已声明界限的子类型,所以我们不知道 T 的某一实例化将有什么构造函数。要解决这一问题,可以用下述三种方法之一:
要求类型参数的所有实例化都包括不带参数的(zeroary)构造函数。
只要泛型类的运行时实例化没有包括所需的构造函数,就抛出异常。
修改语言的语法以包括更详尽的类型参数界限。
来源:developerWorks 作者:Eric E. Allen 责编:豆豆技术应用