練習のために、私はマージソートアルゴリズムを実装しようとしていますが、ジェネリック型配列をインスタンス化しようとするとかなり速く動けなくなりました。私の計画がうまくいくかどうかは完全にはわかりませんが、現時点で興味深い部分 (または質問の仕方によってはイライラする部分) は、merge() メソッドの 2 行目です。newInstance() メソッドは、どのクラスとして開始する必要があるかを知る必要がありますが、arr1.getClass() が完全に正常にコンパイルされたとしても、実行時に機能しません。
public void mergeSort(T[] arr) {
T[] merged = merge(Arrays.copyOfRange(arr, 0, arr.length/2), Arrays.copyOfRange(arr, arr.length/2+1, arr.length-1));
}
@SuppressWarnings({"unchecked"})
public T[] merge(T[] arr1, T[] arr2) {
// A new array of type T that will contain a merged version of arr1 and arr2
T[] merged = (T[]) Array.newInstance(arr1.getClass(), arr1.length+arr2.length);
int i1 = 0, i2 = 0;
for (int i = 0; i < arr1.length + arr2.length; i++) {
if (arr1[i1].compareTo(arr2[i2]) < 0) {
merged[i] = arr1[i1];
i1++;
} else {
merged[i] = arr2[i2];
i2++;
}
}
return merged;
}
エラーメッセージは次のとおりです。
Exception in thread "main" java.lang.ClassCastException: [[Ljava.lang.String; cannot be cast to [Ljava.lang.Comparable;
at sort.SortingAndSearching.merge(SortingAndSearching.java:94)
at sort.SortingAndSearching.mergeSort(SortingAndSearching.java:84)
at sort.SortingAndSearching.main(SortingAndSearching.java:19)