诊断Java代码: 轻松掌握 Java 泛型,第4部分 - 编程入门网
诊断Java代码: 轻松掌握 Java 泛型,第4部分时间:2011-02-11 IBM Eric E. Allen至此,在这个讨论 JSR-14 和 Tiger 中泛型类型的微型系列中,我们已经探讨了: 泛型类型及被设计成支持它们的即将发布的功能 基本类型、受约束的泛型以及多态方法上的限制 几个强加给这些 Java 扩展的限制 这些扩展语言的编译器所用的实现策略如何使这些限制成为必需 在泛型类型中添加对“裸”类型参数的 new 操作的支持所带来的影响 本月,我们将探讨在可以处理 mixin(可能被期望是泛型类型中最强大的功能)之前需要先解决的问题,以此来结束对 Java 语言中泛型类型的讨论。 mixin vs 包装 mixin 是由其父类参数化的类。例如,请考虑以下这个泛型类,它继承了它本身的类型参数: class Scrollable<T> extends T {...} 类 Scrollable 的目的是要向 GUI 窗口小部件嵌入添加可滚动性所必需的功能性。这个泛型类的每个应用都会继承一个不同的父类。例如, Scrollable<JTextPane> 是 JTextPane 的子类,而 Scrollable<JEditorPane> 是 JEditorPane 的子类。对比这种嵌入功能的方法和 Java Swing 库中现有的功能性,在这个库中,如果我们想使 JComponent 是可滚动的,必须将其“包装”在 JScrollPane 中。 包装不仅需要添加访问被包装类的功能的转发方法,而且它还阻止我们在需要被包装对象的实例的上下文中使用由此产生的可滚动对象(例如,我们不能将 JScrollPane 传递到需要 JTextPane 的实例的方法中)。通过 Scrollable 的父类将其参数化,在继承多个超类时,我们就能保持对涉及滚动的功能的单点控制。这样能够使用 mixin 让我们重新获得多重继承性的某些强大功能,而又没有附带异常。 在上面的示例中,我们甚至可以对类型参数施加约束以阻止它用于不适当的上下文中。例如,我们可能想使该类型参数强制为 JComponent 的子类: class Scrollable<T extends JComponent> extends T {...} 那么我们的 mixin 只能继承 GUI 组件。 mixin 和泛型类:完美组合 通常,mixin 作为独立语言功能部件添加到某种语言中,就象 Jam 中的那样。但是合并 mixin 以作为泛型类型系统的一部分很吸引人,几乎可以说魅力无穷。原因是:mixin 和泛型类都能被认为是将现有类映射到新类的 函数。 泛型类可被视为将它们的参数映射成新实例化的函数。mixin 可被视为将现有类映射成新子类的函数。通过使用泛型类型合并 mixin,我们能解决其它 mixin 公式的许多关键限制。 在 Java 语言的 Jam 扩展中,mixin 的超类类型没有名称;我们就不能在 mixin 主体中引用它。这一限制会迅速引起一连串各种其它问题。例如,在 Jam 中,禁止程序员将 this 作为参数传递给方法;无法对这样的调用进行类型检查。这一限制的影响极大,因为许多最常见的设计模式都要依赖于能够将 this 作为参数传递。 请考虑访问者模式,其中用 for 方法为复合层次结构中的每个类都定义了访问者类。通常被访问的类包含 accept 方法,它采用访问者并传递 this 来调用该访问者的方法。因此,在 Jam 中,访问者模式不能和 mixin 一起使用。 将 mixin 明确表述为泛型类,我们就始终有父类的句柄,它是该类继承的类型参数。例如,我们可以将 Scrollable 的父类引用为类型 T 。其结果是,在允许将 this 作为类型参数传递时没有任何根本性的困难。 但是,将 mixin 明确表述为泛型类型时有其它一些明显的困难。为了让您初步体会可能产生的某些困难,我们将讨论几个突出的困难以及一些可能的解决方案。 诊断Java代码: 轻松掌握 Java 泛型,第4部分(2)时间:2011-02-11 IBM Eric E. Allenmixin 与类型消除 在讨论任何其它问题之前,我们应该先 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |