轻松掌握 Java 泛型 (第 4 部分)
上一篇 / 下一篇 2008-01-10 18:04:06 / 个人分类:做着
轻松掌握 Java 泛型 (第 4 部分)ITPUB个人空间j+W8rb,H
来源:** 收集整理
ITPUB个人空间6j4fA;~XK
X9Id.j;[7H@2F/{e0 ITPUB个人空间-?6A*p;Xk
r
^`7nD?#JEs0
m:J]"b]3bwY0 Java 开发人员和研究ITPUB个人空间7k;N'SiiV
的影响,并以此文来结束他ITPUB个人空间KZ|/l|He
在相关论坛中与作者及其他
_[Jp+Pn5o)M0论”来访问该论坛。)至此
4b+z-X8s~@S
L[&F0已经探讨了:ITPUB个人空间$F
S k K2wT
人员 Eric Allen 讨论了通过泛ITPUB个人空间O/d-Up
gx'F
对 JSR-14 和 Tiger 中泛型类
0}.q8Y[n0VQc!] |)[0读者分享您对本文的看法。(您ITPUB个人空间6k0e;Zhz+exj5u
,在这个讨论 JSR-14 和 Tiger
型类型添加对 mixin 支持所带来ITPUB个人空间wL p"y\+x%_Y
型的由四部分组成的系列的讨论。ITPUB个人空间 [E:Zpv!nXr!i
也可以单击本文顶部或底部的“讨
sg3`Z(E0中泛型类型的微型系列中,我们
泛型类型及被设计成支持它们的即将发布的功能
基本类型、受约束的泛型以及多态方法上的限制
几个强加给这些 Java 扩展的限制
这些扩展语言的编译器所用的实现策略如何使这些限制成为必需
在泛型类型中添加对“裸”类型参数的 new 操作的支持所带来的影响
本月,我们将探讨在可ITPUB个人空间!a:s'W6E0p&L6M
先解决的问题,以此来结束ITPUB个人空间#V1M1QWS
以处理 mixin(可能被期望是泛
(o n ZnC,q0对 Java 语言中泛型类型的讨论ITPUB个人空间9q'n{3u:g(s5PEh
型类型中最强大的功能)之前需要
9A M!mr5C'I8`$DZP0。ITPUB个人空间ca%}&sD
x;H
mixin vs 包装 ITPUB个人空间2C-g1L0r6yH-VC
mixin 是由其父类参数ITPUB个人空间k!g0V"K]&Tq4}l
数:ITPUB个人空间+@ W X9It$p
化的类。例如,请考虑以下这个
泛型类,它继承了它本身的类型参
class Scrollable< T> extends T {...}
^4f9jF5Z$bvX0 不要错过本系列的其它文章
第 1 部分,轻松掌握 Java 泛型(2003 年 2 月)
第 2 部分,轻松掌握 Java 泛型类ITPUB个人空间B)~8Y,m9A,vs E
型,第 2 部分(2003 年 3 月)
nnu&v%}jU*f*STf0
第 3 部分,轻松掌握 Java 泛型,第 3 部分(2003 年 4 月)
类 Scrollable 的目的是要向 GUI 窗口小部件嵌入添加可滚动性所必需的功能性。这个泛型类的每个应用都会继承一个不同的父类。例如,Scrollable< JTextPane> 是 JTextPane 的子类,而 Scrollable< JEditorPane> 是 JEditorPane 的子类。对比这种嵌入功能的方法和 Java Swing 库中现有的功能性,在这个库中,如果我们想使 JComponent 是可滚动的,必须将其“包装”在 JScrollPane 中。
muWY
r,}0 包装不仅需要添加访问被包装类的功ITPUB个人空间!GM6jZi(?i'J
的实例的上下文中使用由此产生的可滚动ITPUB个人空间v"h9L6Hx,I
JTextPane 的实例的方法中)。通过 ScrITPUB个人空间0C#n6q%kSV [/s
们就能保持对涉及滚动的功能的单点控制
/kj&q)A3o]nR*w3^0的某些强大功能,而又没有附带异常。ITPUB个人空间9w9T
DkbR5y
`&u(hP\
能的转发方法,而且它还阻止我们在需要被包装对象
hM1g2Dgew
@O0对象(例如,我们不能将 JScrollPane 传递到需要
Q&L-k {Z/apJ8n%|j7[0ollable 的父类将其参数化,在继承多个超类时,我ITPUB个人空间#aN5mP3?
`%k
。这样能够使用 mixin 让我们重新获得多重继承性
在上面的示例中,我们ITPUB个人空间0b{ FD9pEf
如,我们可能想使该类型参
}$Vt#l(Rc [^0 甚至可以对类型参数施加约束以ITPUB个人空间;y YP2A+iP
数强制为 JComponent 的子类:ITPUB个人空间d
P~S7p6T
阻止它用于不适当的上下文中。例
class Scrollable< T extends JComponent> extends T {...}
ITPUB个人空间?+Yw)\ns;D:{Z(r&X6U
那么我们的 mixin 只能继承 GUI 组件。
mixin 和泛型类:完美组合
!aH*{.NZ$c:J0 通常,mixin 作为独立语言功能部件ITPUB个人空间Z'j {1P
}f K v
mixin 以作为泛型类型系统的一部分很吸ITPUB个人空间e"S
q#yX~
类都能被认为是将现有类映射到新类的函
d!P L3w&o:i1o0 添加到某种语言中,就象 Jam 中的那样。但是合并
!X(P\t f([ U_;y0引人,几乎可以说魅力无穷。原因是:mixin 和泛型
9G3lE,MC'r[0数。
Ml3S ^xt5w9vc!I0
泛型类可被视为将它们ITPUB个人空间H5o.v$W`G%W"e
子类的函数。通过使用泛型ITPUB个人空间adQEE{6t
的参数映射成新实例化的函数。
&?[(Wq bc|;l.R0类型合并 mixin,我们能解决其ITPUB个人空间z ig,P)Pk*A8~q
mixin 可被视为将现有类映射成新ITPUB个人空间Q.M&Z4jF0`C6eG2m
它 mixin 公式的许多关键限制。ITPUB个人空间I/OI
LNW
在 Java 语言的 Jam
'|"M4g)wzi0中引用它。这一限制会迅速ITPUB个人空间LH+\j5t7B]
this 作为参数传递给方法ITPUB个人空间2u#Kn*[%m[
多最常见的设计模式都要依
-_3jw}@%k
C0 扩展中,mixin 的超类类型没有
d,g!HY"lQ0引起一连串各种其它问题。例如
N._-o&Y E&Y M iR(m0;无法对这样的调用进行类型检
+T9WV'c/N_3\5{0赖于能够将 this 作为参数传递ITPUB个人空间~2w6]+G3hCP6y
名称;我们就不能在 mixin 主体
j6y@f2i}0,在 Jam 中,禁止程序员将
B:@6d|q\0查。这一限制的影响极大,因为许
F#C!{G5vX0。ITPUB个人空间:sEsf/h"L7`
请考虑访问者模式,其
(SHi6t"aO'Qd0常被访问的类包含 accept
W~'@y3?%x-Z']Sc0在 Jam 中,访问者模式不
:{5s2do'D&aA`w0 中用 for 方法为复合层次结构ITPUB个人空间`*L Fel#Z,O4r/h
方法,它采用访问者并传递 thi
Wn)EV il0能和 mixin 一起使用。ITPUB个人空间gg-F[2ZO
中的每个类都定义了访问者类。通
}OVlm[0vM(b8u%G0s 来调用该访问者的方法。因此,
将 mixin 明确表述为泛型类,我们
c:E"Z9E m4`)h8S-s&y\0如,我们可以将 Scrollable 的父类引用ITPUB个人空间._&K{&v;NHZ3X
传递时没有任何根本性的困难。
s.H+pPH+J0 就始终有父类的句柄,它是该类继承的类型参数。例ITPUB个人空间!SO"K&I{Q.\
为类型 T。其结果是,在允许将 this 作为类型参数
但是,将 mixin 明确表述为泛型类
/]5r]-}[
S/`0产生的某些困难,我们将讨论几个突出的
!oE?DiV)u2UZk0 型时有其它一些明显的困难。为了让您初步体会可能ITPUB个人空间;ZbX
B?/Fi~
困难以及一些可能的解决方案。
Ul&w[0`+^?.}0
mixin 与类型消除
FWRY8PT4Xw6|I_0 在讨论任何其它问题之ITPUB个人空间v`X.w,D
过使用由 JSR-14 和 Tiger
V!kk2b\ ZgV9F5V0支持添加到 Java 语言中。
por%K B%LV.h0 前,我们应该先指出,与上月讨
&I#R:ytxuH$|0使用的简单类型消除(type er
论的泛型类型的功能扩展一样,通
c!@@*vH0asure)策略,不能将对 mixin 的
要了解其原因,请考虑
m-S
ZDIg%S{Y0型参数的界限!例如,上一ITPUB个人空间5\0z.l9^bv1}
。那显然不是我们所希望的
{A#F~8q"G@;Q0 在继承类型参数的类被消除时会ITPUB个人空间'~%Q9IpDO1_
个示例中类 Scrollable 的每个ITPUB个人空间2oOc1s4Jih
。
r(|:z an3h Bj0 出现什么情况。该类会最终继承类ITPUB个人空间*h*[~T[ O
b
实例化最终都继承类 JComponent
为了通过泛型类型支持 mixin,我们ITPUB个人空间r0c9`zvdj s
编码这一信息的方法有许多,它们实际上
&F