gpt4 book ai didi

java - 制作一个 Comparator 对象来对通用 List

转载 作者:行者123 更新时间:2023-11-30 01:39:11 26 4
gpt4 key购买 nike

我正在尝试为实现 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)

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

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>() {
...
});
}

它可以编译并运行。有什么好的解释吗?

最佳答案

您在这里使用了逆变。

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

举个我最喜欢的例子,如果你有一个可以按面积比较任意两个形状的比较器,那么你显然可以用它来比较任意两个三角形 - 所以可以对 List<Triangle> 进行排序。使用AreaShapeComparator .

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

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

关于java - 制作一个 Comparator 对象来对通用 List<?使用 Collections.sort() 扩展 T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1540190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com