java是什么?超级T>语法?
我无法理解以下语法:
public class SortedList< T extends Comparable< ? super T> > extends LinkedList< T >
我看到SortedList类扩展了LinkedList。我只是不知道是什么
T extends Comparable< ? super T>
意味着
到目前为止,我对它的理解是T型必须是一个实现可比较的。。。但是什么是< ? super T >
你可以在下面搜索框中键入要查询的问题!
我无法理解以下语法:
public class SortedList< T extends Comparable< ? super T> > extends LinkedList< T >
我看到SortedList类扩展了LinkedList。我只是不知道是什么
T extends Comparable< ? super T>
意味着
到目前为止,我对它的理解是T型必须是一个实现可比较的。。。但是什么是< ? super T >
# 1 楼答案
考虑下面的例子:
使用类声明中定义的类型参数
公共类ArrayList扩展了AbstractList。。。{
public boolean add(E o)//这里只能使用“E”,因为它已经被定义为类的一部分
使用类声明中未定义的类型参数
如果类本身不使用类型参数,您仍然可以为方法指定一个类型参数,方法是在返回类型之前的一个非常不寻常(但可用)的空间中声明它。这种方法说T可以是“任何类型的动物”
注:
两者都是合法的,但它们是不同的。第一个表示可以传入实例化为Animal的ArrayList对象或任何动物子类型,如ArrayList、ArrayList或ArrayList。但是,只能在第二个中传递ArrayList,而不能传递任何子类型
# 2 楼答案
这意味着类型
T
必须实现Comparable
ofT
或它的一个超类例如,如果
A
扩展了B
,如果您想使用SortedList<A>
,A
必须实现Comparable<A>
或Comparable<B>
,或者实际上只是Comparable
这允许使用任何有效的比较器构造
A
列表# 3 楼答案
这是一个下限通配符
JLS 4.5.1 Type Arguments and Wildcards
例如
List<? super Integer>
包括List<Integer>
、List<Number>
和List<Object>
通配符用于使泛型更加强大和灵活;边界用于维护类型安全性
另见
至于这在
<T extends Comparable<? super T>>
中是如何有用的,这是当你有类似Cat extends Animal implements Comparable<Animal>
的东西时看看^{} 的签名
因此,使用
List<Cat> listOfCat
,您现在可以Collections.sort(listOfCat)
是否已宣布如下:
然后您必须使用
Cat implements Comparable<Cat>
才能使用sort
。通过使用? super T
有界通配符,Collections.sort
变得更加灵活另见
# 4 楼答案
泛型中的super与extends相反。与其说comparable的泛型类型必须是T的子类,不如说它必须是T的超类。区别很重要,因为extends告诉您可以从类中得到什么(您至少可以得到这个,也许是子类)。super告诉您可以将什么放入类中(最多是这个,可能是一个超类)
在这种特定情况下,它所说的是类型必须实现其自身或其超类的可比性。因此,考虑java。util。日期它实现了
Comparable<Date>
。但是java呢。sql。日期它还实现了Comparable<java.util.Date>
如果没有超级签名,SortedList将无法接受java的类型。sql。Date,因为它没有实现自身的可比性,而是实现自身的超类
# 5 楼答案
这意味着
T
必须实现Comparable<T itself or one of T's superclasses>
意思是因为SortedList
是排序的,所以它必须知道如何比较其泛型T
参数的两个类。这就是为什么T
必须实现Comparable<T itself or one of T's superclasses>