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

2022-08-31 09:33:20

我无法理解以下语法:

public class SortedList< T extends Comparable< ? super T> > extends LinkedList< T >

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

T extends Comparable< ? super T>

方法。

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


答案 1

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

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

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


答案 2

这是一个下限通配符。

JLS 4.5.1 类型参数和通配符

在只需要部分了解类型参数的情况下,通配符很有用。[...]上限由以下语法表示:

? extends B

其中 是上限。[...]允许在通配符上声明下限,使用以下语法:B

? super B

其中 是下限。B

例如,A 包括 、 和 。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)

因此,使用 ,您现在可以 。List<Cat> listOfCatCollections.sort(listOfCat)

如果声明如下:

public static <T extends Comparable<T>> void sort(List<T> list)

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

另请参见

  • 有效的 Java 第 2 版,第 28 项:使用有界通配符提高 API 灵活性
    • 此外,PECS原则:“生产者消费者extendssuper"

推荐