因此,我试图建立一个通用的实用程序函数来对各种类型的列表(主要是内置包装器和字符串)进行排序。示例代码如下:
public void sortArrays(List<?>... arr) {
// do here
}
并且可以如下使用
List<Integer> a = // initialization
List<String> b = // initialization
...
sortArrays(a, b)
该函数将对varargs List进行排序,并且我打算使用Collections.sort(...),但是不幸的是,它不适用于捕获的List。对于我要实现的目标,是否有适当的解决方法或方法?
假设您希望每个列表按照其自然顺序独立排序,则可以使用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
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);
}
}