Documentation

The Java™ Tutorials
Hide TOC
Erasure of Generic Types泛型类型的擦除
Trail: Learning the Java Language
Lesson: Generics (Updated)
Section: Type Erasure

Erasure of Generic Types泛型类型的擦除

During the type erasure process, the Java compiler erases all type parameters and replaces each with its first bound if the type parameter is bounded, or Object if the type parameter is unbounded.在类型擦除过程中,如果类型参数有界,Java编译器将擦除所有类型参数,并用其第一个界替换每个类型参数;如果类型参数无界,则用Object替换每个类型参数。

Consider the following generic class that represents a node in a singly linked list:考虑下面的泛型类,该类表示单个链接列表中的节点:

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; }
    // ...
}

Because the type parameter T is unbounded, the Java compiler replaces it with Object:因为类型参数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; }
    // ...
}

In the following example, the generic Node class uses a bounded type parameter:在以下示例中,泛型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; }
    // ...
}

The Java compiler replaces the bounded type parameter T with the first bound class, Comparable:Java编译器用第一个界定类Comparable替换有界类型参数T,如下所示:

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; }
    // ...
}

Previous page: Type Erasure
Next page: Erasure of Generic Methods