ランタイム例外が発生している場合は、キャストしようとしたオブジェクトがその型を持っていないことを意味します。言語はそれと関係がありません。おそらくコードにバグがあります。
編集:Javaのタイプシステムの仕組みによって混乱するようです。 C#では、ジェネリックは実際には実行時に異なる型を表します。 Javaでは、ジェネリック型は実行時に存在しません。コンパイル時の型チェックをより便利にするために便利です。コンパイル時には、ジェネリック型は、タイプ消去と呼ばれるプロセスで実際の型に置き換えられます。
通常、汎用タイプの消去はObject
ですが、T
の上限を指定したため、その境界に変換されます。Comparable
。したがって、消去後、コードは次のようになります。言い換えれば
Comparable[] aux = (Comparable[]) new Object[xs.length];
、あなたはタイプObject[]
の配列を作成し、すぐにComparable[]
を型にキャストしようとしています。 Object
はComparable
を実装していないので、型は互換性がないため、実行時例外が発生します。代わりにComparable
の配列を作成することでこれを修正できます。
public static <T extends Comparable<? super T>> void mergeSort(T[] xs) {
T[] aux = (T[]) new Comparable[xs.length];
mergeSort(xs, aux, 0, xs.length);
}
私はあなたが、それは非常に興味深いですhttp://stackoverflow.com/questions/1817524/generic-arrays-in-java を見るべきだと思います。 –