What is <? super T> syntax?
我无法理解以下语法:
1 | public class SortedList< T extends Comparable< ? super T> > extends LinkedList< T > |
我看到类排序列表扩展了LinkedList。我只是不知道
1 | T extends Comparable< ? super T> |
号
手段。
到目前为止,我对它的理解是,类型t必须是实现可比性的类型……但是,什么是
泛型中的super与extends相反。不是说Comparable的泛型类型必须是t的子类,而是说它必须是t的超类。区别很重要,因为扩展告诉你可以从类中得到什么(至少你会得到这个,也许是子类)。super告诉你可以把什么放到类中(最多这个,可能是超类)。
在这种特定的情况下,它所说的是类型必须实现其自身或其超类的可比性。所以考虑java.util.date。执行
如果没有超级签名,SortedList将无法接受java.sql.date的类型,因为它不实现与自身类似的类型,而是实现自身的超级类。
它是一个下限通配符。
JLS 4.5.1类型参数和通配符Wildcards are useful in situations where only partial knowledge about the type parameter is required. [...] An upper bound is signified by the syntax:
1 ? extends Bwhere
B is the upper bound. [...] it is permissible to declare lower bounds on a wildcard, using the syntax:
1 ? super Bwhere
B is a lower bound.
号
例如,
通配符用于使泛型更加强大和灵活;边界用于维护类型安全。
另请参见- Java语言指南/泛型/更有趣的通配符
- 有效Java第二版,项目28:使用有界通配符增加API灵活性
- 同时,PECS原则:"生产者
extends 消费者super "
小精灵
- 同时,PECS原则:"生产者
使用在类声明中定义的类型参数
公共类ArrayList扩展抽象列表…{public boolean add(e o)//此处只能使用"e",因为它已经被定义为类的一部分
使用类声明中未定义的类型参数
1
2public <T extends Animal> void takeThing(ArrayList<T> list)
// Here we can use <T> because we declared"T" earlier in the method declaration如果类本身不使用类型参数,您仍然可以为方法指定一个参数,方法是在返回类型之前的一个非常不寻常(但可用)的空间中声明它。这种方法说它不能是"任何一种动物"。
小精灵
至于这在
看看EDOCX1的签名
1 | public static <T extends Comparable<? super T>> void sort(List<T> list) |
因此,使用
是否声明如下:
1 | public static <T extends Comparable<T>> void sort(List<T> list) |
号
那么你就得让
小精灵
这意味着
这意味着类型
例如,如果
这允许使用任何有效的比较器构造
请考虑以下示例:
注:
1 2 3 4 5 | public <T extends Animal> void takeThing(ArrayList<T> list) is NOT same as public void takeThing(ArrayList<Animal> list) |
。
两者都是合法的,但它们是不同的。第一个指示可以传入实例化为动物或任何动物子类型(如arraylist、arraylist或arraylist)的arraylist对象。但是,在第二个函数中只能传递arraylist,而不能传递任何子类型。