在泛型中
允许 class A<T extends Number>
但是
class A<T super Integer>
是不允许的
我没有明白这一点。这可能听起来像新手问题,但我被困在其中
答案 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
,也不可能使用子类引用来引用父类实例