2013-04-12 13 views
6

オンラインアルゴリズムクラスの宿題をしているときに問題が発生しました。 Tが同等であるT[]Object[]をキャストすると、実行時例外オブジェクトの配列を比較可能な配列にキャストする

public static <T extends Comparable<? super T>> void mergeSort(T[] xs) { 
    T[] aux = (T[]) new Object[xs.length]; 
    mergeSort(xs, aux, 0, xs.length); 
} 

を発生させ、私は一般的な配列を作成しても問題はありませんが、私はむしろ、この中に対処する方法を学びたいC#で、それを書き換えることができJava。

+0

私はあなたが、それは非常に興味深いですhttp://stackoverflow.com/questions/1817524/generic-arrays-in-java を見るべきだと思います。 –

答えて

12

ランタイム例外が発生している場合は、キャストしようとしたオブジェクトがその型を持っていないことを意味します。言語はそれと関係がありません。おそらくコードにバグがあります。

編集:Javaのタイプシステムの仕組みによって混乱するようです。 C#では、ジェネリックは実際には実行時に異なる型を表します。 Javaでは、ジェネリック型は実行時に存在しません。コンパイル時の型チェックをより便利にするために便利です。コンパイル時には、ジェネリック型は、タイプ消去と呼ばれるプロセスで実際の型に置き換えられます。

通常、汎用タイプの消去はObjectですが、Tの上限を指定したため、その境界に変換されます。Comparable。したがって、消去後、コードは次のようになります。言い換えれば

Comparable[] aux = (Comparable[]) new Object[xs.length]; 

、あなたはタイプObject[]の配列を作成し、すぐにComparable[]を型にキャストしようとしています。 ObjectComparableを実装していないので、型は互換性がないため、実行時例外が発生します。代わりに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); 
} 
+0

明らかにバグがあり、明らかにJavaがジェネリックを扱う方法と関係があります。 C#では、制約型パラメータの配列を作成することに問題はありません。 – synapse

+0

@synapse私はあなたのために物事を明確にするために私の答えを編集しました。 – Antimony

2

配列は共変であり、実行時に要素の型を保持することを意味します。 Javaのジェネリックはそうではありません。だから、基本的にはミックスしない。

も参照してください:Generic arrays in Java

あなたはジェネリック医薬品の配列を作成することはできませんし、それらにキャストすることはできません。 arraylistsを使う方が良い。

3

これを試してみてください:

public static <T extends Comparable<? super T>> void mergeSort(T[] xs) { 
    T[] aux = (T[])java.lang.reflect.Array.newInstance(xs.getClass().getComponentType(), xs.length); 
    mergeSort(xs, aux, 0, xs.length); 
} 
+0

ありがとうございます。 Java Generics FAQは100ページもの長さです。 – synapse

+0

これを行うにははるかに簡単な方法があります。私の答えを見てください。 – Antimony

+0

簡単ですが危険です。 >のように型を変更するだけでも、元のコードでも(mergeSortメソッドのシグネチャに依存して)コンパイルして実行します。しかし、たとえばTが常にStringで、String [] aux2 =(String [])auxを実行しようとすると、例外が発生します。あなたのComparable配列にも同じ問題があります。だからシンプルですが、いつも動かないかもしれません。 – jdb