在类型擦除过程中,Java编译器将擦除所有类型参数,如果类型参数是有界的,则将每个参数替换为其第一个边界;如果类型参数是无界的,则将其替换为Object。
    考虑以下表示单个链接列表中的节点的泛型类:

    1. public class Node<T> {
    2. private T data;
    3. private Node<T> next;
    4. public Node(T data, Node<T> next) {
    5. this.data = data;
    6. this.next = next;
    7. }
    8. public T getData() { return data; }
    9. // ...
    10. }

    由于类型参数T是无界的,因此Java编译器将其替换为Object:

    1. public class Node {
    2. private Object data;
    3. private Node next;
    4. public Node(Object data, Node next) {
    5. this.data = data;
    6. this.next = next;
    7. }
    8. public Object getData() { return data; }
    9. // ...
    10. }

    在下面的示例中,泛型Node类使用有界类型参数:

    1. public class Node<T extends Comparable<T>> {
    2. private T data;
    3. private Node<T> next;
    4. public Node(T data, Node<T> next) {
    5. this.data = data;
    6. this.next = next;
    7. }
    8. public T getData() { return data; }
    9. // ...
    10. }

    Java编译器将指定类型参数T替换为第一个边界类Comparable:

    1. public class Node {
    2. private Comparable data;
    3. private Node next;
    4. public Node(Comparable data, Node next) {
    5. this.data = data;
    6. this.next = next;
    7. }
    8. public Comparable getData() { return data; }
    9. // ...
    10. }