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



In Generics

允许class A<T extends Number>

不允许class A<T super Integer>

我不明白这一点。这听起来像是新手问题,但我被困住了<</p>

div class="one_answers">

引用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,也不可以使用子类引用来引用父类实例。

最新更新