【问题标题】:Crafting a Comparator object for sorting generic List<? extends T> using Collections.sort()制作一个 Comparator 对象以对通用 List<?使用 Collections.sort() 扩展 T>
【发布时间】:2009-10-08 20:23:42
【问题描述】:

我正在尝试为实现 MyInterface 的任何类的对象列表实现通用排序实用程序方法。根据 Java API (http://java.sun.com/javase/6/docs/api/java/util/Collections.html),Collections.sort() 方法签名是:

public static <T> void sort(List<T> list, Comparator<? super T> c)

我不确定带有通配符参数的 List 是否可以替代“普通”参数化 List,但我尝试过:

static void mySort(List<? extends MyInterface> myList, SortCriteria mySortCriteria) {
    Collections.sort(myList, new Comparator<? super MyInterface>() {
        ...
    });
}

并得到一个编译时错误,

The type new Comparator(){} cannot extend or implement Comparator<? super MyInterface>
A supertype may not specify any wildcard.

所以,我把它改成了:

static void mySort(List<? extends MyInterface> myList, SortCriteria mySortCriteria) {
    Collections.sort(myList, new Comparator<MyInterface>() {
        ...
    });
}

它编译并工作。有什么好的解释吗?

【问题讨论】:

  • 当你说“当我尝试它时”,你到底尝试了什么?你能发布一些代码

标签: java generics sorting comparator bounded-wildcard


【解决方案1】:

你在这里使用逆变

基本上,您需要有一个比较器可以比较列表中的任意两项。如果列表的类型为T,这意味着它必须能够比较任何两个类型为 T 的项目 - 但如果它可以比较任何两个类型为 X 的项目,其中 T 是 X 的子类,那么没关系也是。

举我最喜欢的例子,如果你有一个可以按面积比较任意两个形状的比较器,那么你可以清楚地使用它来比较任意两个三角形 - 所以可以使用 AreaShapeComparatorList&lt;Triangle&gt; 进行排序。

我不确定你在最后一段中所说的“当我尝试它时”是什么意思...如果你能给出一个简短但完整但不起作用的例子,我们可以尝试解释原因。

编辑:好的,您不能在 new 表达式中使用 ? extends X? extends Y - 您只能将它们用作方法、类型或变量的声明的一部分。当你构造一个 new 对象时,你需要指定确切的类型。

【讨论】:

  • @Eugene:您需要确切地展示您尝试过的内容 - 不仅仅是一行中的单个 sn-p,而是整个上下文。
【解决方案2】:

我不明白这个约束对 Comparator 的影响

约束表示比较器必须至少能够比较List 的泛型类型,或其超类型。例如,使用Comaparator&lt;Number&gt;List&lt;Integer&gt; 进行排序是有效的。如果Comparator 可以比较Numbers,那么它当然可以比较Integers。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多