为什么泛型中的超级关键字不允许在类级别使用
2022-09-03 15:01:36
在泛型中
class A<T extends Number>
允许
但
class A<T super Integer>
不允许
我不明白这一点。这可能听起来像新手问题,但我被困在其中
在泛型中
class A<T extends Number>
允许
但
class A<T super Integer>
不允许
我不明白这一点。这可能听起来像新手问题,但我被困在其中
类定义中不允许使用超级绑定。
//this code does not compile ! class Forbidden<X super Vehicle> { }
为什么?因为这样的结构没有意义。例如,您无法使用 Vehicle 擦除 type 参数,因为可以使用 Object 实例化类 Forbidden。因此,无论如何,您都必须将类型参数擦除到 Object。如果考虑一下Forbidden类,它可以用任何值来代替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