为什么泛型中的超级关键字不允许在类级别使用

2022-09-03 15:01:36

在泛型中

class A<T extends Number>允许

class A<T super Integer>不允许

我不明白这一点。这可能听起来像新手问题,但我被困在其中


答案 1

引用Java泛型:扩展,超级和通配符解释

类定义中不允许使用超级绑定。

//this code does not compile !
class Forbidden<X super Vehicle> { }

为什么?因为这样的结构没有意义。例如,您无法使用 Vehicle 擦除 type 参数,因为可以使用 Object 实例化类 Forbidden。因此,无论如何,您都必须将类型参数擦除到 Object。如果考虑一下Forbidden类,它可以用任何值来代替X,而不仅仅是车辆的超类。使用超级绑定是没有意义的,它不会给我们带来任何东西。因此,这是不允许的。


答案 2

考虑这个例子:-

案例 1 上限:

public class Node<T extends Comparable<T>> {
    private T data;
    private Node<T> next; 
}

在这种情况下,类型擦除将绑定参数替换为第一个绑定类。TComparable

public class Node {
   private Comparable data;
   private Node next;
}

众所周知,父类引用可用于引用子类对象。因此,此代码无论如何都是可以接受的,因为引用可以指向任一类或其子类的实例。dataComparable

案例 2 下限:

如果我们能有这样的代码

public class Node<T super Comparable<T>> {
    private T data;
    private Node<T> next; 
}

在这种情况下,编译器不能使用或任何其他类来替换此处的绑定类型,并且子类引用也不可能用于引用父类实例。ObjectT


推荐