本教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言变更以获取Java SE 9和后续版本中更新的语言功能的概要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
在类型擦除过程中,Java编译器擦除所有类型参数,并将每个类型参数替换为其第一个边界(如果类型参数有边界),或者如果类型参数无边界,则替换为Object。
考虑以下表示单链表中节点的泛型类:
public class Node<T> { private T data; private Node<T> next; public Node(T data, Node<T> next) { this.data = data; this.next = next; } public T getData() { return data; } // ... }
因为类型参数T没有边界,Java编译器将其替换为Object:
public class Node { private Object data; private Node next; public Node(Object data, Node next) { this.data = data; this.next = next; } public Object getData() { return data; } // ... }
在下面的示例中,泛型Node类使用了有边界的类型参数:
public class Node<T extends Comparable<T>> { private T data; private Node<T> next; public Node(T data, Node<T> next) { this.data = data; this.next = next; } public T getData() { return data; } // ... }
Java编译器将有边界的类型参数T替换为第一个边界类Comparable:
public class Node { private Comparable data; private Node next; public Node(Comparable data, Node next) { this.data = data; this.next = next; } public Comparable getData() { return data; } // ... }