有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我无法理解以下语法:

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

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

T extends Comparable< ? super T>

意味着

到目前为止,我对它的理解是T型必须是一个实现可比较的。。。但是什么是< ? super T >


共 (5) 个答案

  1. # 1 楼答案

    考虑下面的例子:

    1. 使用类声明中定义的类型参数

      公共类ArrayList扩展了AbstractList。。。{
      public boolean add(E o)//这里只能使用“E”,因为它已经被定义为类的一部分

    2. 使用类声明中未定义的类型参数

      public <T extends Animal> void takeThing(ArrayList<T> list)
                                                  // Here we can use <T> because we declared "T" earlier in the method declaration                  
      

      如果类本身不使用类型参数,您仍然可以为方法指定一个类型参数,方法是在返回类型之前的一个非常不寻常(但可用)的空间中声明它。这种方法说T可以是“任何类型的动物”

    注:

    public <T extends Animal> void takeThing(ArrayList<T> list)             
    
    is NOT same as              
    
    public void takeThing(ArrayList<Animal> list)
    

    两者都是合法的,但它们是不同的。第一个表示可以传入实例化为Animal的ArrayList对象或任何动物子类型,如ArrayList、ArrayList或ArrayList。但是,只能在第二个中传递ArrayList,而不能传递任何子类型

  2. # 2 楼答案

    这意味着类型T必须实现Comparableof T或它的一个超类

    例如,如果A扩展了B,如果您想使用SortedList<A>A必须实现Comparable<A>Comparable<B>,或者实际上只是Comparable

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

  3. # 3 楼答案

    这是一个下限通配符

    JLS 4.5.1 Type Arguments and Wildcards

    Wildcards are useful in situations where only partial knowledge about the type parameter is required. [...] An upper bound is signified by the syntax:

    ? extends B
    

    where B is the upper bound. [...] it is permissible to declare lower bounds on a wildcard, using the syntax:

    ? super B
    

    where B is a lower bound.

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

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

    另见


    至于这在<T extends Comparable<? super T>>中是如何有用的,这是当你有类似Cat extends Animal implements Comparable<Animal>的东西时

    看看^{}的签名

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

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

    是否已宣布如下:

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

    然后您必须使用Cat implements Comparable<Cat>才能使用sort。通过使用? super T有界通配符,Collections.sort变得更加灵活

    另见

    • 有效Java第二版,第28项:使用有界通配符提高API灵活性
      • 此外,PECS原则:“生产者{}消费者{}”
  4. # 4 楼答案

    泛型中的super与extends相反。与其说comparable的泛型类型必须是T的子类,不如说它必须是T的超类。区别很重要,因为extends告诉您可以从类中得到什么(您至少可以得到这个,也许是子类)。super告诉您可以将什么放入类中(最多是这个,可能是一个超类)

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

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

  5. # 5 楼答案

    这意味着T必须实现Comparable<T itself or one of T's superclasses> 意思是因为SortedList是排序的,所以它必须知道如何比较其泛型T参数的两个类。这就是为什么T必须实现Comparable<T itself or one of T's superclasses>