参考资料:《
Java Generics and Collections
》
1. 构造函数
这个没什么好说的,在一个泛型类中,类型参数在类声明的头部声明的,也就是接着class ClassName <T, U>。在定义构造函数时,不需要带上类型参数,函数体中就可以引用类型参数。不过在使用new创建对象时,需要在类名后面带上类型参数,否则将会导致一个未检查(Unchecked)的异常信息。
2. 静态成员
静态成员最重要的一个特点,就是整个类都共享它。由于Java泛型采用擦除法实现,也就是说一个泛型类,不管任何类型参数,在运行时都拥有相同的class类型,像List<Integer>,List<String>和List<List<Strng>>在运行时的类型都是List。因此,拥有不同类型参数的泛型类,也都共享相同的静态成员。这样一来,静态成员,无论是静态实例域,还是静态方法,都不允许引用该类的类型参数。在调用静态方法,或使用静态变量时,也只能使用ClassName.method()这样的形式,不能带有任何的类型参数。
当然了,静态方法可以声明为泛型方法,就像Collections.addAll()等方法一样,只要不是引用类本身声明的类型参数就可以。
3. 嵌套类
Java允许一个类嵌套定义在另一个类里面,有内部类,静态内部类以及匿名内部类等多种形式。一般来说,使用比较广泛而且比较有用的就是静态内部类,另外匿名内部类也很方便。与静态成员的规则类似,静态内部类不能引用外部类的类型参数,内部类以及匿名内部类则可以正常引用,其中匿名内部类由于语法的原因,将不能声明自己的类型参数。
public
class
LinkedCollection
<
E
>
extends
AbstractCollection
<
E
>
{
private class Node {
private E element;
private Node next = null ;
private Node(E elt) { element = elt; }
}
private Node first = new Node( null );
private Node last = first;
}
class LinkedCollection < E > extends AbstractCollection < E > {
private static class Node < T > {
private T element;
private Node < T > next = null ;
private Node(T elt) { element = elt; }
}
private Node < E > first = new Node < E > ( null );
private Node < E > last = first;
}
private class Node {
private E element;
private Node next = null ;
private Node(E elt) { element = elt; }
}
private Node first = new Node( null );
private Node last = first;
}
class LinkedCollection < E > extends AbstractCollection < E > {
private static class Node < T > {
private T element;
private Node < T > next = null ;
private Node(T elt) { element = elt; }
}
private Node < E > first = new Node < E > ( null );
private Node < E > last = first;
}
上面代码演示了在泛型类中使用内部类,静态内部类的不同之处。内部类可以引用外部类的类型参数,所以不需要声明为泛型类了;而静态内部类由于无法引用,只能声明为泛型类,并在创建对象的时候把类型参数传进来。推荐使用后一种,因为静态内部类一般来说会更加简单,也更加高效。