1

私はJavaでジェネリッククラスを持っています:

public class PriorityList<T extends Number> implements Comparable<T> {  

    T[] array = (T[]) new Object[10];

そして、私はエラーがあります

java.lang.ClassCastException: [Ljava.lang.Object; [Ljava.lang.Number; にキャストできません。

このキャスト(T[]) new Object[10]によってエラーが発生します。

配列要素をソートする必要があるため、比較メソッドが必要です。だから私はこのようなクラスを宣言することはできません

public class PriorityList<T extends Number> 

T値を保持するために、私自身のリンクリストによっていくつかの意味を持つ他のオプションがあります。しかし、このキャスティングの問題を解決する別の方法があります

(T[]) new Object[10];

?

PS コレクションの使用は禁止されています。

4

4 に答える 4

1

T の消去は Number なので、次のようになります。

Number[] array = new Number[10];

あなたを十分に近づけます。Number の任意のサブクラス (たとえば any T) をその配列に格納してもかまいません。(注: (T[])new Object[10]akaへのキャスト(Number[])new Object[10]が例外を引き起こす理由も説明する必要があります。)

于 2013-04-25T01:54:32.187 に答える
0

Numberは Objectですが、 Objectは Number ではありません

このメソッドにjava.util.Arraysは、必要なロジックが含まれています。タイプ T の配列を作成できます

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
于 2013-04-24T18:40:08.993 に答える