In Generics
允许class A<T extends Number>
但
不允许class A<T super Integer>
我不明白这一点。这听起来像是新手问题,但我被困住了<</p>
引用Java泛型:扩展,超级和通配符解释:
类定义中不允许使用超级边界。
//this code does not compile ! class Forbidden<X super Vehicle> { }
为什么?因为这样的构造没有意义。例如,不能使用 Vehicle 擦除类型参数,因为类 Forbidden 可以使用 Object 实例化。因此,无论如何都必须将类型参数擦除为对象。如果考虑类禁止,它可以取任何值来代替X,而不仅仅是车辆的超类。使用超级绑定是没有意义的,它不会给我们带来任何东西。因此,这是不允许的。
考虑这个例子:-
案例 1 上限:
public class Node<T extends Comparable<T>> {
private T data;
private Node<T> next;
}
在这种情况下,类型擦除会将绑定参数 T
替换为第一个绑定类 Comparable
。
public class Node {
private Comparable data;
private Node next;
}
众所周知,父类引用可用于引用子类对象。因此,无论如何,此代码都是可以接受的,因为引用data
可以指向Comparable
或其子类的实例。
案例2 下限:
如果我们能有类似
public class Node<T super Comparable<T>> {
private T data;
private Node<T> next;
}
在这种情况下,编译器既不能使用 Object
或任何其他类来替换此处的绑定类型T
,也不可以使用子类引用来引用父类实例。