为什么要使用泛型程序
泛型程序设计, 意味着编写的代码可以被很多不同类型的对象所重用. 例如, 我们并不希望为聚集String和File对象分别设计不同的类, 实际上,也不需要这样做, 因为一个ArrayList类可以聚集任何类型的对象, 这是一个泛型程序设计的实例. 没有泛型以前, ArrayList维护的时一个object类型的数组, 这样当获取一个值时, 必须使用强制类型转换. (并非类型判断, 而是强制的类型转换)
泛型实现了参数化类型的概念, 使代码可以应用于多种类型, 泛型术语的意思是, 适用于许多许多的类型, 那么注意 比如定义: public class Pair<T> {} 这个类, 这个类的类名只是 Pair, 而不带泛型 (构造函数的时候)
简单的泛型类定义
public class Pair<T> { public Pair() { first = null, second = null; } public Pair(T first, Tsecond) {this.first = first; this.second = second;} public T getFirst() { return first;} public T getSecond() { return second;} public void setFirst( T newvalue) {fisrt = newvalue;}; public void setSecond(T newvalue) {second = newvalue}; private T first; private T second; }
注意, 这种泛型类, 泛型与类是一体的, 例如在函数中, 返回一个这样的实例变量的话, 就要使用 Pair<T> 作为类型, 例如: public static Pair<String> minmax(String[] args), 这种方法叫做泛型方法. <> 内放入具体的类型
泛型方法可以定义在普通类和泛型类中.
对泛型类型的限制, <T extends Comparable>, 这里的extends并不是继承的意思, Comparable本身是个接口, 这里的含义是, 抽象出来是 <T extends Bounding Type>, Bounding Type 表示绑定类型, 而 T 应该是绑定类型的子类型, T 和 绑定类型可以是类也可以是接口. 选择关键字 extends 更接近子类的概念, 并不是传统意义的继承. 并且可以有多个限制, 比如 <T extends Comparable & Serializable>, 例如:
public static <T extends Comparable> Pair<T> minmax(T[] a) // 这里的返回类型就是 受到限制的子类型, Pair<T>还是那句话, 是一个整体, 就当做是一个名称就可以了. 在构造函数的时候, 看来还不能当做是一个名称.
约束和局限性
1) 不能用基本类型实例化类型参数, 例如 Pair<double>不行, 但是可以有 Pair<Double>
2) 运行时类型检查时, 只能使用基本类型, 例如, if (a instanceof Pair<String>) // ok的, if (a instanceof Pair<T>) // NG
3) 不能抛出也不能捕获泛型实例, 例如: try {} catch (T e) {}; // 这里的 T e 无法捕获
4) 参数化数组类型不合法, 例如: Pair<String>[] table = new Pair<String>[0]; 即泛型类不能被用作定义数组变量 ( 貌似可以 )
5) 不能实例化类型变量, 例如 new T()
泛型这个东西, 看来使用系统的泛型应该就够了对于 web 开发.