Я, вероятно, нашел ответ :
Во время процесса стирания типа, компилятор Java стирает все параметры типа и заменяет каждый его первой границей, если параметр типа ограничен, илиОбъект, если параметр типа неограничен.
Рассмотрим следующий универсальный класс, представляющий узел в односвязном списке:
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 первой границейкласс, сопоставимый:
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; }
// ...
}
Спасибо @Oleksandr за это.