0

次の方法で ArrayLinearList クラスを実装しました

public class ArrayLinearList<T> implements LinearList<T>, Iterable<T>

クラスメンバーを含む

protected T[] element

クラスの機能を拡張するために、最初のクラスから継承する新しいクラスを作成します

class SuperList<T extends Comparable<T>> extends ArrayLinearList<T>

ここで、型 T が Comparable インターフェースを実装していることを確認します (これは変更できません)。

SuperList クラスには、次のメソッドがあります

public void replace( int pedro, T maria ){
   element[ pedro ] = maria;

}

メソッドの行は次のエラーを生成します

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

しかし、次の方法でクラスを宣言すると、この問題はなくなります (ただし、この方法では、クラス オブジェクトを比較できなくなります)。

class SuperList<T> extends ArrayLinearList<T>{

この問題を解決するための助けをいただければ幸いです。クラス \ [ ArrayLinearList を変更することは許可されていません。クラス SuperList だけです。

前もって感謝します。

4

1 に答える 1

3

例外に基づいて、で初期化elementnew Object[someLength]、未チェックのキャストを行っているようですT[]。これは で発生している可能性がありArrayLinearListます。問題は、このコードでは次のことです。

element[ pedro ] = maria;

elementComparable[]は実行時にとして扱われ、は でObject[]はありませんComparable[]

ジェネリック配列の作成に関連する既存の投稿が多数ありますが、(型パラメーターの境界を狭めて) 継承をミックスに投入したため、問題は興味深いものです。最善の解決策は、クラスelement内でのみ対話することのようです。ArrayLinearListそれを作成しprivate、ゲッターとセッターを公開します。これにより、このような実行時エラーを回避する必要があります ( のようなチェックされていないキャストを実行するときに回避するには、いくつかの考慮が必要です(T[])new Object[someLength])。

例えば:

public class ArrayLinearList<T> implements LinearList<T>, Iterable<T> {

    private final T[] elements;

    public ArrayLinearList(final int length) {
        @SuppressWarnings("unchecked") // won't be exposed outside this class
        final T[] withNarrowedType = (T[])new Object[length];
        elements = withNarrowedType;
    }

    public final void set(final int index, final T element) {
        elements[index] = element;
    }
}

編集:ArrayLinearList 「クラスだけを変更することは許可されていません」という免責事項に気付きましたSuperListArrayLinearListの作者は型安全でないコードを書いたので、それは残念です。しかし、問題は、なぜようなメソッドSuperList.replaceが配列と直接対話する必要があるのか​​ (またはまったく存在しないのか) になります。指定されたインデックスに新しい要素を割り当てているだけのように見えます-それArrayLinearListを行うために使用できる方法はありませんか?

他のすべてが失敗した場合は、最後の回避策を次に示します。

((Object[])element)[pedro] = maria;

しかし、それは根底にある問題を覆い隠すひどい解決策です。

于 2013-08-27T00:17:18.180 に答える