将ArrayList <comparative>转换为不同的ArrayList类型</comparative>

时间:2013-01-12 04:04:00

标签: java sorting casting arraylist

我有一个排序方法,它接受一个ArrayList&lt; Comparable&gt;,使用compateTo()方法对它进行排序,然后返回一个已排序的ArrayList&lt; Comparable&gt;。这是:

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;

我该如何解决这个问题? 谢谢你的时间。

3 个答案:

答案 0 :(得分:2)

泛型的要点是你不需要转换任何引用类型。此外,混合通用和原始类型的稀有类型也很糟糕。通常ListArrayList更受欢迎,按照惯例,它比其他任何内容都要好。

您的方法的开头应该类似于:

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#中支持的)