诊断Java代码: 轻松掌握 Java 泛型,第4部分 - 编程入门网
程序员或 MyTextPane 的程序员预见这个有问题的 getSize 覆盖(毕竟,他们甚至不可能在同一个开发团队),因此我们称之为 意外覆盖。
当 mixin 被明确表述为泛型类时,意外覆盖的问题特别讨厌。因为 mixin 的父类可能用类型参数被实例化,因此类型检查器就不能确定意外方法覆盖的所有情况。而且,在意外覆盖出现时抛出运行时异常是无法接受的,因为客户机程序员无法预测何时将抛出这样的异常。如果我们想编写可靠的程序,那么我们必须禁止在运行时出现无法预料的错误。 另一个解决方案是只隐藏这些相互冲突的方法中的一个,并解析所有匹配的方法调用以引用未隐藏的方法。这个解决方案的问题是我们希望诸如 Scrollable<MyTextPane> 这样的 mixin 实例化可用于调用 Scrollable 对象的上下文以及调用 MyTextPane 对象的上下文中。隐藏 getSize 方法中的任一个都会在这两个上下文中禁止使用 Scrollable<MyTextPane> 。 在 1998 年召开的有关编程语言原理的 ACM SIGPLAN-SIGACT 研讨会(请参阅 参考资料)上,Felleisen、Flatt 和 Krishnamurthi 提出了在 mixin 不属于泛型类型的上下文中针对该问题的一个好的解决方案:基于使用 mixin 实例化的上下文来解决对相互冲突的方法的引用。在这个解决方案中,mixin 包含有这样的观点:确定在名称不一致的情况中要调用哪个方法。 在 mixin 作为泛型类型的情况中,我们可以应用同样的解决方案。我们只要设计一些 观点,这些观点在泛型类型的上下文中有效,并且还允许向后兼容 JVM。在 Rice JavaPLT 实验室中,我们已经在“A First-Class Approach to Genericity”(请参阅 参考资料)一文中提出了这样一种解决方案。 有得必有失 正如示例、问题和可能的解决方案所演示的,在 Java 编程中继承泛型类型以包含对 mixin 的支持会产生一种功能强大的语言,但同时也引入了一些有待克服的问题。这是典型的编程语言设计:只能通过使许多现有功能变复杂才能添加所希望的功能。在编程语言领域中,没有任何免费的午餐。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |