当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

诊断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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 诊断Java代码 - 筹划"可测试的"操纵程序
  • <b>诊断Java代码: 臆想实现错误情势,第2部份</b>
  • 诊断Java代码: 筹划可扩大的操纵程序,第2部份
  • 诊断Java代码::Split Cleaner错误情势
  • 诊断Java代码: Fictitious Implementation错误情势,第1部份
  • 诊断Java代码:筹划可扩大的操纵程序,第1部份
  • 诊断Java代码:孤线程(Orphaned Thread)错误情势
  • 诊断Java代码
  • 诊断Java代码: 单元测试与自动化代码解析协同工作
  • 诊断Java代码: Repl供应交互式评价
  • 诊断Java代码: Liar View错误情势
  • 诊断Java代码: Java编程中的断言和时态逻辑
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .