轻松掌握 Java 泛型 (第 3 部分)ITPUB个人空间X{0_7f_
来源:** 收集整理
/~u^'O Z7J0 ITPUB个人空间VY$`/fDAR5W
ITPUB个人空间 Va6eVnM8FQu
o7bI\%t7}.j}B0
tB!El?p[0 有效的构造函数调用
首先,为了对类型参数ITPUB个人空间4j!t!C2id!t
造函数对于 T 的每个实例
sLW-W QkP.x0我们不知道 T 的某一实例ITPUB个人空间`W5W;k0P
Xm
:ITPUB个人空间 ~(Gw2w(R2| C
构造合法的 new 表达式(如 neITPUB个人空间*|7f[gYq$e'q$A0kO$t2f
化都有效。但由于我们只知道 T
blzT*B`"m-~0化将有什么构造函数。要解决这
w T()),必须确保我们调用的构
p0B f ^/DI0是其已声明界限的子类型,所以
4DbO,ng:Bge0一问题,可以用下述三种方法之一
要求类型参数的所有实例化都包括不带参数的(zeroary)构造函数。 ITPUB个人空间/~1]A7OWx
只要泛型类的运行时实例化没有包括所需的构造函数,就抛出异常。 ITPUB个人空间Xo3hm&pi
修改语言的语法以包括更详尽的类型参数界限。
第 1 种方法:需要不带参数的构造函数
只要求类型参数的所有ITPUB个人空间ht-QnDUo
。使用这种方法也有先例。ITPUB个人空间9m!W!kom
实例化都包括不带参数的构造函
数。该解决方案的优点是非常简单
处理类似问题的现有 JITPUB个人空间S-h&I&m^/y
U6B&C
函数来解决问题的。然而,ITPUB个人空间-Wd$s.s[OW
造函数。
~)?6M CQ^T8}0 ava 技术(象 JavaBean 技术)
I_]]2|K/wr~0该方法的一个主要缺点是:对于
就是通过要求一个不带参数的构造ITPUB个人空间Fc0H;^2}is1|e
许多类,没有合理的不带参数的构
例如,表示非空容器的任何类在构造ITPUB个人空间$e5C7Y6g7T
构造函数将迫使我们先创建实例,然后再
5^1S:^E![:VC-h0实践会导致问题的产生(您可能想要阅读
!E6dD[3}x&S0Initializer bug pattern”,以获取详
E(y\KMDTS0 函数中必然使用表示其元素的参数。包括不带参数的
$l])i4\s0s~0进行本来可以在构造函数调用中完成的初始化。但该ITPUB个人空间HjJ-k{ |1fkG
2002 年 4 月发表的本专栏文章“The Run-onITPUB个人空间h%x2x4w1qf4s
细信息;请参阅参考资料。)
u_uQZ LZ| z0
第 2 种方法:当缺少所需构造函数时,抛出异常
处理该问题的另一种方法是:只要泛
/e%~.MLqS0异常。请注意:必须在运行时抛出异常。ITPUB个人空间!`5lK^m
态地确定所有将在运行时发生的泛型类的ITPUB个人空间$F;_B,hR
型类的运行时实例化没有包括所需构造函数,就抛出ITPUB个人空间@;?,K)p"[7]I_2F
因为 Java 语言的递增式编译模型,所以我们无法静
RJ'] i:YPX0实例化。例如,假设我们有如下一组泛型类:
g:`&v~T0@I J0
清单 1.“裸”类型参数的 New 操作
class C< T> {
T makeT() {
C"i
J,IOQ
`0 return new T();