诊断Java代码: 轻松掌握Java泛型,第3部份[Java编程]
本文“诊断Java代码: 轻松掌握Java泛型,第3部份[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这一系列主要谈论在 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)构造函数.
只要泛型类的运行时实例化没有包含所需的构造函数,就抛出非常.
改正语言的语法以包含更细致的范例参数边界.
第 1 种办法:需求不带参数的构造函数
只要求范例参数的全部实例化都包含不带参数的构造函数.该办理筹划的长处是非常简单.利用这种办法也有先例.
处理近似问题的现有 Java 技术(象 JavaBean 技术)就是通过要求一个不带参数的构造函数来办理问题的.但是,该办法的一个主要缺陷是:关于很多类,没有公道的不带参数的构造函数.
比方,表示非空容器的任何类在构造函数中必定利用表示其元素的参数.包含不带参数的构造函数将迫使我们先成立实例,然后再举行本来可以在构造函数调用中完成的初始化.但该实践会招致问题的产生(您大概想要阅读 2002 年 4 月发表的本专栏文章“The Run-on Initializer bug pattern”,以获得具体信息;请参阅 参考资料.)
第 2 种办法:当贫乏所需构造函数时,抛出非常
处理该问题的另一种办法是:只要泛型类的运行时实例化没有包含所需构造函数,就抛出非常.请注意:必须在运行时抛出非常.因为 Java 语言的递增式编译模子,所以我们无法静态地肯定全部将在运行时发生的泛型类的实例化.比方,假定我们有以下一组泛型类:
清单 1.“裸”范例参数的 New 操作
class C<T> {
T makeT() {
return new T();
}
}
class D<S> {
C<S> makeC() {
return new C<S>();
}
}
以上是“诊断Java代码: 轻松掌握Java泛型,第3部份[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |