当前位置: 首页 > 知识库问答 >
问题:

一般性的解释?超级T>>收藏。排序/可比代码?

何哲
2023-03-14

我一直使用可比的界面,通过collection.sort.为我的班级提供自然排序

基本上,如果我有一个人类,我会让它实现可比接口,并提供comareTo的实现。然而,在javadocs中Collections.sort的定义中,我看到了这个签名

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

我完全不理解泛型的定义?它不应该只是说

<T implements Comparable<T>>

有人能帮我吗?

共有2个答案

管弘
2023-03-14

即使类型参数实现了一个接口,也总是使用带有泛型通配符的扩展。

如果你看一个实现Comparable的类,你会发现它实际上(应该)实现Comparable

如果您考虑传递给可比接口的类型参数以及它在comareTo()方法中的使用方式,这是有意义的。

正如PM 77-1雄辩地指出的那样,super关键字允许类T或它的父类之一实现可比性。

索嘉石
2023-03-14

实际上,这意味着T可以实现Comparable

例如,它意味着学生类可以实现可比较

public class Person {}

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

在这种情况下,List可以按Collections.sort()排序,但只能基于Person的属性,因为您将学生实例作为Person传递到comareTo()中(当然,除非您向下转换它)。

然而,在实践中,你永远不会看到一个学生类实现可比性

之间的差异是可比较的

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());

 类似资料:
  • 首先,很抱歉再次就这个话题提问。我很清楚这里有很多问题和答案。我已经读了其中的一些,但我的问题是我仍然不知道我做错了什么。这是我的代码: 看来我只是瞎了眼,看不到我的错误,所以如果你们中有人能帮我解决这个问题,我将非常感谢。 编辑:我想做的是确定一条线在左上角有0/0坐标的坐标系中是上、下、最左还是最右。这些点是double类型的。下面是错误消息:

  • 我们的一些用户在排序列表时遇到了这个异常。抛出它的代码是 而 getTime() 的类型为 “long”

  • 是的,我知道有很多问题与相同的问题,但我似乎真的找不到我的比较器有什么问题。 所以,这里是: 代码非常简单:我需要根据它们如何改变我的主要结构对一些对象进行排序,并且我首先想要最高值。 由于计算或对象的影响可能需要一些时间,我只是缓存值以便重用它们,因此在排序之前,我检查是否有缓存值或是否需要计算它。 一旦我计算出将< code>m1或< code>m2应用于我的结构的结果,我就将更改恢复。 你可

  • 我正在看java jpoint会议的视频。 我对以下Alexey Shipilev报告幻灯片有疑问: 请原谅幻灯片上的非英语。实际上作者说变量集是不可能的 附注。 如果我理解Alexey符号正确,它尊重以下代码:

  • 本文向大家介绍比较排序之快速排序(实例代码),包括了比较排序之快速排序(实例代码)的使用技巧和注意事项,需要的朋友参考一下 快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查。 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换。而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置。例如为了找到最佳基数,则需要在

  • 我知道它已经被询问和回答了数百万次,但我仍然无法弄清楚为什么我在排序期间收到了违规。这是我的代码: 我收到了这个错误 有什么想法吗?