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

时间:2016-05-24 10:42:39

标签: java generics inheritance polymorphism

在泛型中

允许

class A<T extends Number>

但是

class A<T super Integer>是不允许的

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

2 个答案:

答案 0 :(得分:5)

引用Java Generics: extends, super and wildcards explained

  

在类定义中不允许超级绑定。

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

为什么呢?因为这种结构没有意义。例如,您无法使用Vehicle删除类型参数,因为可以使用Object实例化Forbidden类。因此,您必须将类型参数擦除到Object。如果考虑禁用类,它可以取代X的任何值,而不仅仅是超级类的Vehicle。使用超级界限没有意义,它不会给我们任何东西。因此不允许这样做。

答案 1 :(得分:1)

考虑这个例子: -

案例1上限:

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

在这种情况下,type erasure用第一个绑定类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,也不可能使用子类引用来引用父类实例