-1

我有一个采用 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 对象,创建了一堆,并将它们存储在一个名为 members 的 ArrayList<DVD> 中。现在,当我尝试像这样对成员进行排序时:

members = (ArrayList<DVD>) YaSort.insertionSort(members);

我收到以下错误:线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Comparable; 无法投射到 [LDVD;

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

4

3 回答 3

2

泛型的要点是您不需要强制转换任何引用类型。此外,混合通用类型和原始类型的稀有类型也很糟糕。按照惯例,通常比其他任何事情都更List喜欢。ArrayList

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

public static <T extends Comparable<? super T>> List<T> insertionSort(
    List<T> input
) {
    List<T> result  = new ArrayList<T>(input);

(实际上,为了获得最大性能,可能不是来自对大量数据的插入排序,对数组做一些 hacky 会更好。顺便说一句:您引用的错误似乎来自使用数组而不是集合。)

于 2013-01-12T04:14:40.807 回答
1

您似乎想要对实现Comparable并返回相同对象列表的对象列表进行排序,而不仅仅是Comparable. 在这种情况下,您可以使用编译器可以使用的方法参数来确定返回结果的类型:

public static <T extends Comparable<? super T>> ArrayList<T>
    insertionSort(ArrayList<T> input) {
    ....
}

然后你可以分配给members没有演员:

members = YaSort.insertionSort(members);
于 2013-01-12T04:11:26.027 回答
0

您需要定义membersas ArrayList<Comparable>,因为即使 DVD 实现/扩展 ComparableArrayList<DVD>也没有实现/扩展ArrayList<Comparable>- 这称为协变/逆变,Java 不支持。(实际上在 C# 中是支持的)

于 2013-01-12T04:06:30.247 回答