什么是<?超级T>语法?

Shr*_*ers 94 java

我无法理解以下语法:

public class SortedList< T extends Comparable< ? super T> > extends LinkedList< T >
Run Code Online (Sandbox Code Playgroud)

我看到类SortedList扩展了LinkedList.我只是不知道是什么

T extends Comparable< ? super T>
Run Code Online (Sandbox Code Playgroud)

手段.

到目前为止我对它的理解是类型T必须是一个实现Comparable的类型......但是它是什么< ? super T >

Yis*_*hai 98

泛型中的超级是扩展的反面.而不是说可比较的泛型类型必须是T的子类,它说它必须是T的超类.区别很重要因为extends告诉你你可以从一个类中获得什么(你得到的至少是这个,也许是一个子类).super告诉你你可以把什么放进课堂(最多这个,也许是一个超类).

在这个特定的情况下,它所说的是该类型必须实现其自身或其超类的可比性.所以考虑java.util.Date.它实现了Comparable<Date>.但是java.sql.Date怎么样?它也实现Comparable<java.util.Date>了.

如果没有超级签名,SortedList将无法接受java.sql.Date的类型,因为它不实现自身的Comparable,而是实现自身的超类.


pol*_*nts 84

这是一个较低限度的通配符.

JLS 4.5.1类型参数和通配符

通配符在需要仅部分了解类型参数的情况下非常有用.[...]上限由语法表示:

? extends B
Run Code Online (Sandbox Code Playgroud)

B上限在哪里.[...]允许使用以下语法在通配符上声明下限:

? super B
Run Code Online (Sandbox Code Playgroud)

哪里B是下限.

List<? super Integer>,例如,包括List<Integer>,List<Number>,和List<Object>.

通配符用于使泛型更强大和灵活; 边界用于维护类型安全.

也可以看看


至于它是如何有用的<T extends Comparable<? super T>>,那就是你有类似的东西Cat extends Animal implements Comparable<Animal>.

看看签名 Collections.sort

public static <T extends Comparable<? super T>> void sort(List<T> list)
Run Code Online (Sandbox Code Playgroud)

因此,有了List<Cat> listOfCat,你现在可以Collections.sort(listOfCat).

如果它被宣布如下:

public static <T extends Comparable<T>> void sort(List<T> list)
Run Code Online (Sandbox Code Playgroud)

那么你必须Cat implements Comparable<Cat>要使用sort.通过使用? super T有界通配符,Collections.sort变得更加灵活.

也可以看看

  • Effective Java 2nd Edition,Item 28:使用有界通配符来增加API灵活性
    • 此外,PECS原则:"生产者extends消费者super"


Pet*_*hev 11

它意味着T必须实现Comparable<T itself or one of T's superclasses> 意义是因为SortedList它是排序的,它必须知道如何比较它的泛型T参数的两个类.这就是T必须实施的原因Comparable<T itself or one of T's superclasses>


小智 6

这意味着该类型T必须实现ComparableT还是它的超类之一。

例如,如果Aextends B要使用SortedList<A>,则A必须实现Comparable<A>Comparable<B>,或者实际上只是just Comparable

这允许A使用任何有效的比较器构造s 的列表。