我有一个排序方法,它接受一个ArrayList< Comparable>,使用compateTo()方法对它进行排序,然后返回一个已排序的ArrayList< Comparable>。这是:
public static ArrayList<Comparable> insertionSort(ArrayList<Comparable>
input) {
Comparable temp;
ArrayList<Comparable> result;
result = (ArrayList<Comparable>) input.clone();
if (result.size() > 1) {
for (int k = 1; k < result.size(); k++) {
for (int j = 1; j <= k; j++) {
if (result.get(k - j).compareTo(result.get(k - j + 1)) >0){
temp = result.get(k - j + 1);
result.set(k - j + 1, result.get(k - j));
result.set(k - j, temp);
}
}
}
}
return result;
}
在我的程序中的其他地方,我定义了实现Comparable接口的DVD对象,创建了一堆它们,并将它们存储在ArrayList&lt; DVD&gt;中。叫成员。现在,当我尝试对这样的成员进行排序时:
members = (ArrayList<DVD>) YaSort.insertionSort(members);
我收到以下错误:线程“main”中的异常java.lang.ClassCastException:[Ljava.lang.Comparable;不能投[LDVD;
我该如何解决这个问题? 谢谢你的时间。
答案 0 :(得分:2)
泛型的要点是你不需要转换任何引用类型。此外,混合通用和原始类型的稀有类型也很糟糕。通常List
比ArrayList
更受欢迎,按照惯例,它比其他任何内容都要好。
您的方法的开头应该类似于:
public static <T extends Comparable<? super T>> List<T> insertionSort(
List<T> input
) {
List<T> result = new ArrayList<T>(input);
(实际上,为了获得最大性能,可能不是来自对大量数据的插入排序,对数组执行hacky操作会更好.BTW:您引用的错误似乎来自使用数组而非集合。)
答案 1 :(得分:1)
您似乎想要对实现Comparable
的对象列表进行排序,并返回相同对象的列表,而不仅仅是Comparable
。在这种情况下,您可以使用编译器可以使用的方法参数来确定返回结果的类型:
public static <T extends Comparable<? super T>> ArrayList<T>
insertionSort(ArrayList<T> input) {
....
}
然后你可以分配到members
而无需演员:
members = YaSort.insertionSort(members);
答案 2 :(得分:0)
您需要将members
定义为ArrayList<Comparable>
,因为即使认为DVD实现/扩展可比较ArrayList<DVD>
也未实现/扩展ArrayList<Comparable>
- 这称为协方差/逆变而且Java不支持。
(它实际上是在C#中支持的)