本文将介绍J2SE 5.0中三个比较重要的特性: 枚举类型, 注释类型, 范型, 并在此基础上介绍在如何在Eclipse 3.1开发环境中开发枚举类型, 注释类型和范型应用。 J2SE 5.0 (Tiger)的发布是Java语言发展史上的一个重要的里程碑, 是迄今为止在 Java 编程方面所取得的最大进步。 J2SE 5.0提供了很多令人激动的特性。这些特性包括范型(generics)的支持, 枚举类型(enumeration)的支持, 元数据(metadata)的支持, 自动拆箱(unboxing)/装箱(autoboxing), 可变个数参数(varargs), 静态导入(static imports), 以及新的线程架构(Thread framework)。 随着J2SE 5.0的推出, 越来越多的集成开发环境(IDE)支持J2SE 5.0的开发。 著名的开源Java IDE Eclipse从3.1M4开始支持J2SE 5.0的开发, 目前最新的版本是3.1RC4。 本系列将介绍J2SE 5.0中三个比较重要的特性: 枚举类型, 注释类型, 范型, 并在此基础上介绍在如何在Eclipse 3.1开发环境中开发枚举类型, 注释类型和范型应用。本文将介绍范型。 3.1范型(Generics)简介
这种方法实现的列表需要使用强制类型转换(又称显示造型), 因此不是类型安全的. 在上面这段代码种, 虽然变量名为stringList, 但是我们仍然可以把一个整型对象添加到这个队列中, 例如, 清单3.1.2 类型不安全的代码示例
在这种情况下, 从字符列表中获取对象时, 强制类型转换就会导致运行时异常. 清单3.1.3 类型不安全的代码示例
范型是Java迈向类型安全的一个重要步骤, 使用范型可以构造出类型安全的代码. 3.2声明范型 3.2.1 范型类 下面的例子中介绍了如何创建一个最简单范型类 清单3.2.1, 最简单的范型类
类名后面带有 下面通过一个列表的例子来具体说明如果声明范型类和类型参数的用法. 清单3.2.2, 范型列表
在列表的例子中, 类型参数T被用来表示列表中的元素的类型, 即, 这个列表中的元素是T类型的. 在使用这个列表时, 这个类型参数T会被具体的类型所替代. 注意, 由于T时类型参数不是具体的类, 所以不能使用new操作符创建T的对象,例如new T(), 或者, new T[10]. 3.2.2 范型接口 在J2SE 5.0中, 不仅仅可以声明范型类, 也可以声明范型接口, 声明范型接口和声明范型类的语法类似, 也是在接口命称后面加上
3.2.3声明多个类型参数的范型类或者接口 在声明范型类的时候, 可是使用多个类型参数. 多个类型参数之间用逗号分开, 例如, 清单3.2.4, 多个类型参数的范型类
Eclipse 3.1的类创建向导支持创建范型类, 如下图所示, 使用Eclipse接口向导创建范型接口 3.2.4范型方法 类型参数(type parameter)不仅仅可以用来声明范型类或者范型接口, 也可以用来声明范型方法, 而且这种声明的范型方法可以用在非范型类中, 声明范型方法的一般格式是 清单3.2.5 范型方法的一般形式
3.2.5 受限范型 受限范型是指类型参数的取值范围是受到限制的. extends关键字不仅仅可以用来声明类的继承关系, 也可以用来声明类型参数(type parameter)的受限关系.例如, 我们只需要一个存放数字的列表, 包括整数(Long, Integer, Short), 实数(Double, Float), 不能用来存放其他类型, 例如字符串(String), 也就是说, 要把类型参数T的取值范型限制在Number极其子类中.在这种情况下, 我们就可以使用extends关键字把类型参数(type parameter)限制为数字, 清单3.2.7 受限范型示例
在Eclipse 3.1中, 上例中的编译错误信息如下图所示 3.3 在程序中使用范型 在创建范型类的对象的时候, 和创建普通对象基本类似, 必须提供具体的类类型来替代类型参数T (J2SE 5.0目前不支持原始类型作为类型参数(type parameter)). 清单3.3.1, 使用范型类
3.3.2 使用范型解决类型安全性问题 3.3.3 二义性错误 GenMap在声明是使用了2个类型参数T和V, 因此在创建GenMap的对象的时候也需要提供2个具体的类类型来替代这2个类型参数, 例如, 清单9, 多个参数的范型类
上例中, T和V虽然看起来是两个不同的类型参数, 但是在使用这个范型类的时候, T和V很有可能被替换成同一种类型. 因此在声明多个类型参数的范型类时, 要注意避免这种二义性错误, 例如, 清单10, 二义性错误
在上面这段代码, 如果T和V被替换成同一种类型, set函数的签名(signature)就是完全一样的, 所以编译器会报告二义性错误. 正确的用法是声明2个不同名的方法, 例如, 清单10, 二义性错误
3.3.4 使用通配符 前面我们创建了范型的列表, 如果我需要一个方法来处理范型列表, 例如, 我们希望把列表中的每个元素都打印出来, 但是类型参数(type parameter)只能使用在声明一个范型类的时候, 如果类型参数使用在函数定义里会导致编译错误
在这种情况下, 我们需要用另外一种方法来表示一个范型类, 否则, 就可能需要书写多个print函数
J2SE 5.0中提供了范型的通配符"?", "?"可以用来代替任何类型, 例如使用通配符来实现print方法
3.4. 范型的一些局限型
(2) 不能实例化类型参数的数组
(3) 类的静态变量不能声明为类型参数类型
(4) 范型类不能继承自Throwable以及其子类
3.5.范型小结
|