【问题标题】:Explanation of generic <T extends Comparable<? super T>> in collection.sort/ comparable code?泛型<T extends Comparable<?的解释超 T>> 在 collection.sort/ 可比较的代码?
【发布时间】:2014-09-11 04:37:47
【问题描述】:

我一直使用可比较的接口通过 collection.sort 为我的班级提供自然排序。

基本上如果我有一个person类,我会让它实现Comparable接口,并提供compareTo的实现。但是在 javadocs 中 Collections.sort 的定义中,我看到了这个签名

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

我根本不理解这个泛型定义?不应该只是说

<T implements Comparable<T>>

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 这意味着类T本身或其超类之一实现Comparable
  • @PM77-1 感谢您的简单解释,看来&lt;T extends Comparable&lt;? super T&gt;&gt; 是最正确的

标签: java generics


【解决方案1】:

其实就是说T可以实现Comparable&lt;? super T&gt;,而不仅仅是Comparable&lt;T&gt;

例如表示Student类可以实现Comparable&lt;Person&gt;,其中StudentPerson的子类:

public class Person {}

public class Student extends Person implements Comparable<Person> {
    @Override public int compareTo(Person that) {
        // ...
    }
}

在这种情况下,列表可以按Collections.sort() 排序,但仅基于Person 的属性,因为您将Student 实例作为compareTo() 传递给compareTo()(除非您将其向下转换,当然)。

然而,在实践中,您永远不会看到 Student 类实现 Comparable&lt;Person&gt;。那是因为Person 可能已经实现了Comparable&lt;Person&gt;,而Student 继承了它的实现。但是最终结果是相同的:您可以将 List&lt;Student&gt; 传递给 Collections.sort() 并根据 Person 的属性对其进行排序。

Comparable&lt;T&gt;Comparable&lt;? super T&gt; 之间的区别在采用 Comparator&lt;? super T&gt;the overloaded version of Collections.sort() 中更为明显:

class ByAgeAscending implements Comparator<Person> {
    @Override public int compare(Person a, Person b) {
        return a.getAge() < b.getAge();
    }
}

List<Student> students = getSomeStudents();
Collections.sort(students, new ByAgeAscending());

【讨论】:

    【解决方案2】:

    你总是使用 extends 和泛型通配符,即使类型参数实现了一个接口。

    如果您查看实现Comparable 的类,您会发现它实际上(应该)实现Comparable&lt;T&gt;,其中T 是类本身。

    如果您考虑一下传递给Comparable 接口的类型参数以及它在compareTo() 方法中的使用方式,那就很有意义了。

    正如 PM 77-1 雄辩地指​​出的那样,super 关键字允许类 T 或其父类之一实现 Comparable

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2012-01-22
      • 2020-08-22
      • 1970-01-01
      • 2019-10-11
      相关资源
      最近更新 更多