Java Collections.sort通配符列表(List>)

问题描述 投票:1回答:2

因此,我试图建立一个通用的实用程序函数来对各种类型的列表(主要是内置包装器和字符串)进行排序。示例代码如下:

public void sortArrays(List<?>... arr) {
    // do here
}

并且可以如下使用

List<Integer> a = // initialization
List<String> b = // initialization
...

sortArrays(a, b)

该函数将对varargs List进行排序,并且我打算使用Collections.sort(...),但是不幸的是,它不适用于捕获的List。对于我要实现的目标,是否有适当的解决方法或方法?

java arrays list sorting generics
2个回答
1
投票

假设您希望每个列表按照其自然顺序独立排序,则可以使用raw泛型来执行此操作,但是不建议这样做。

@SafeVarargs
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void sortArrays(List<? extends Comparable>... lists) {
    for (List<? extends Comparable> list : lists)
        Collections.sort(list);
}
List<Integer> a = Arrays.asList();
List<String> b = Arrays.asList();
List<Object> c = Arrays.asList();
sortArrays(a, b);
sortArrays(c); // compilation error because Object is not a Comparable

2
投票

Collections#sort的文档说明它接受Collections#sort作为参数,其中List<T>定义为:

T

因此,您应该能够在<T extends Comparable<? super T>> 方法中定义类似的泛型类型:

sortArrays

如果您的目标是传递单一类型的列表,则此解决方案将起作用。有关传递不同类型的列表,请参见下文。


[存在一个利用public <T extends Comparable<? super T>> void sortArrays(List<T>... arr) { for (List<T> list : arr) { Collections.sort(list); } } hacky解决方案,允许您将不同类型的列表传递给raw types到方法:

sortArrays

以上代码段的输出是:

public static void main(String[] args) {
    List<Integer> integerList = new ArrayList<>(List.of(3, 2, 1));
    List<String> stringList = new ArrayList<>(List.of("6", "5", "4"));

    sortArrays(integerList, stringList);

    System.out.println(integerList);
    System.out.println(stringList);
}

public static void sortArrays(List<? extends Comparable>... arr) {
    for (List<? extends Comparable> list : arr) {
        Collections.sort(list);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.