[转]《Java Generics and Collections》读书笔记四:构造函数,静态成员,嵌套类

转自:http://www.diybl.com/course/3_program/java/javaxl/20071220/92737.html

参考资料:《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;
}
上面代码演示了在泛型类中使用内部类,静态内部类的不同之处。内部类可以引用外部类的类型参数,所以不需要声明为泛型类了;而静态内部类由于无法引用,只能声明为泛型类,并在创建对象的时候把类型参数传进来。推荐使用后一种,因为静态内部类一般来说会更加简单,也更加高效。

原文地址:https://www.cnblogs.com/apigiraffe/p/2685120.html