0

次のJavaの問題を正しく理解しているかどうか疑問に思っていました。ジェネリック コレクションを指定すると、

public class HashTable<V extends Comparable<V>> implements HashTableInterface<V> {
    private V[] array;

    public HashTable() {
        this.array = (V[]) new Object[10];
    }
}

コードが壊れて、例外がスローされます: java.lang.ClassCastException: [Ljava.lang.Object; [Ljava.lang.Comparable; にキャストできません。

ただし、変更this.array = (V[]) new Object[10];するthis.array = (V[]) new Comparable[10];と機能します。

私が理解している方法は、コンパイル時に、結果のバイトコードはJavaの型消去に置き換えられるため、一般的な参照を持たないということです。

this.array = (V[]) new Object[10];this.array = (Comparable[]) new Object[10];Object が Comparable を拡張しないため、行が暗黙的に置き換えられ、キャスト例外が発生するため、ブレークします。Comparables の配列に変更することで解決されます。

これは正しいです?ありがとう!

4

1 に答える 1

3

型変数は、その左端の境界の消去まで消去されます。に消去Vされ|Comparable<V>| = Comparableます。バウンドをObject & Comparable<V>消去に変更すると、また動作するようになり|Object| = Objectます(V[]) new Object[10]

于 2012-08-27T08:45:11.973 に答える