-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);

(実際には、最大のパフォーマンスを得るには、おそらく多くのデータの挿入ソートからではなく、配列でハッキーなことを行う方が良いです。ところで:引用しているエラーは、コレクションではなく配列の使用によるもののようです。)

于 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

DVDが実装/拡張する場合でもComparableは実装/拡張しないため、membersとして定義する必要があります。これは共変性/反変性と呼ばれ、Javaではサポートされていません。(実際にはC#でサポートされています)ArrayList<Comparable>ArrayList<DVD>ArrayList<Comparable>

于 2013-01-12T04:06:30.247 に答える