我尝试编写一个泛型类来对任何类型的数组进行排序。
第一个排序函数对任何类型的数组进行排序。
它工作正常。
在第二个排序函数中,我传递了列表并尝试转换为数组以使用第一个排序函数。 但是当我尝试在泛型类中将列表转换为数组时,它会抛出意外的类型错误。
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Sort<T extends Comparable>{
//public T l;
T tmp;
public void sort(T[] l){
for(int i=0;i<l.length;i++){
for(int j=i+1;j<l.length;j++){
if(l[i].compareTo(l[j])>0){
tmp=l[i];
l[i]=l[j];
l[j]=tmp;
}
}
}
System.out.println( Arrays.asList(l));
}
public <T extends Comparable> void sort(List<T> l){
T[] array = (T[]) new Object[l.size()];
sort(l.toArray(T[] array));
// System.out.println(l);
}
public static void main(String[] args){
Integer[] i={2,4,1,5,3};
List<String> l = Arrays.asList("c","d","a","e","b");
Sort s=new Sort();
//String[] j=l.toArray(new String[l.size()]);
s.sort(i);
s.sort(l);
}
}
最佳答案
正如 n247s 所建议的,如果您希望类和方法之间保持一致性,则应该对它们使用相同的参数化类型。
它提出了另一个问题:如果你这样做,你不应该混合橙子和香蕉,因为否则你的排序可能会产生意想不到的结果。假设您在数组或列表中放入了 Comparable 对象的组合,这些对象的设计目的不是为了在它们之间进行比较:String
、Boolean
、CustomClassWhichIsComparable
此外,在将列表转换为数组的方法中,您希望在 Comparable
数组中分配一个 Object
数组。但您不能这样做,因为所有 Object
实例不一定都是 Comparable
实例。
public <T extends Comparable> void sort(List<T> l){
T[] array = (T[]) new Object[l.size()];
sort(l.toArray(T[] array));
}
你可以做到:
public void sort(List<T> l) {
T[] array = (T[]) new Comparable[l.size()];
sort(l.toArray(array));
}
在这两种情况下,您都会收到警告,但也不异常(exception)。
这里是建议修改的类:
public class Sort<T extends Comparable<T>> {
T tmp;
public void sort(T[] l) {
for (int i = 0; i < l.length; i++) {
for (int j = i + 1; j < l.length; j++) {
if (l[i].compareTo(l[j]) > 0) {
tmp = l[i];
l[i] = l[j];
l[j] = tmp;
}
}
}
System.out.println(Arrays.asList(l));
}
public void sort(List<T> l) {
T[] array = (T[]) new Comparable[l.size()];
sort(l.toArray(array));
}
public static void main(String[] args) {
Integer[] i = { 2, 4, 1, 5, 3 };
Sort<Integer> sortInt = new Sort<Integer>();
sortInt.sort(i);
Sort<String> sortString = new Sort<String>();
List<String> l = Arrays.asList("c", "d", "a", "e", "b");
sortString.sort(l);
}
}
关于java - 如何在Java中将通用列表转换为通用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40956596/