如何使用Comparable接口

时间:2016-02-11 07:36:21

标签: java

这是课堂作业的一部分,我无法弄清楚这句话对拯救自己生命的意义。

public static <T extends Comparable<? super T>> void sort(Arraylist<T> list){}

该方法没有实现,因为我应该自己这样做。要排序的列表将包含Integer类型,Double类型和String类型。

我该如何使用Comparable排序不同对象类型的列表以及Comparable<? super T>到底是什么意思?

我的班级课本非常模糊和深奥,这句话非常具体,我不知道在互联网上哪里可以找到它。

修改

好吧,我终于理解了指令=(我不必排序不同项目类型的列表。我应该排序相同项目类型的三个不同列表。但我仍然不明白

Comparable<? super T>

2 个答案:

答案 0 :(得分:2)

因此,如果我理解正确,您可以为通用排序方法创建实现。

如果你打电话给&#39;排序&#39;使用充满字符串的arraylist的方法,该方法将对这些字符串进行排序:

public static <String> void sort(Arraylist<String> list){}

如果使用充满长值的arraylist调用相同的方法,它将对长值进行排序:

public static <Long> void sort(Arraylist<Long> list){}

你不打算用long来排序字符串。

另一种通用方法的示例可以是:

public static <T> void print(T object){
    System.out.println(object.toString());
}

public static <T extends Comparable<? super T>> void sort(Arraylist<T> list){}

更新

您想要一个扩展T

的泛型类型
<T extends Comparable<>

Comparable还需要一个泛型类型,它是您的第一个泛型类型的超类。

<? super T>

答案 1 :(得分:2)

您获得的列表只包含一种T类型,并且您知道T它是Comparable<? super T>的子类型。

所以,如果您的子类型为Comparable<T>,那么事情就会非常简单:您知道您的类型有一个compareTo(T t)方法可用于排序。

但想象一下,java.sql.Timestamp类型为T。它不会实现Comparable<Timestamp>,而是Comparable<Date>。所以它有一个方法compareTo(Date)。但是,这不是问题,因为Timestamp Date,所以您仍然可以使用该方法来比较两个{{1} }}秒。但签名中Timestamp不允许传递Comparable<T>,但限制性太强。

这正是给定签名不仅允许ArrayList<Timestamp>的子类而且允许Comparable<T>的子类作为列表元素的原因。这包括Comparable<? super T>示例之类的情况,因为超类型的比较函数足以满足您的需要。

如果您想了解有关此想法的更多信息,请搜索“对比差异”。