1

ClassCastException を発生させずに、バインドされたジェネリック型の配列を同じジェネリック型の引数を持つメソッドに渡す方法はありますか?:

public class Heap<E extends Comparable>  implements java.lang.Cloneable{

    private java.util.ArrayList<E> list = new java.util.ArrayList<E>();

    public Heap(E[] objects) {
         for (int i = 0; i < objects.length; i++) {
            add(objects[i]);
        }
    }

    private  void add(E newObject){
    ...
    }

    @Override
    protected Heap<E> clone() {
        return new Heap<E>((E[])list.toArray());
    }
}
4

3 に答える 3

1

Joshua Bloch による効果的な Java (項目 25):

ジェネリック型、パラメーター化された型、または型パラメーターの配列を作成することはできません。これらの配列作成式はいずれも有効な new List<E>[]、 new List<String>[]、ではありませんnew E[]

したがって、ジェネリックを持つ配列の代わりにリストを使用してください。

于 2013-02-22T07:06:20.807 に答える
0

それを行うべきすべてのチェックされていないキャストに問題がない場合:

class Heap<E extends Comparable>  implements java.lang.Cloneable{

    private java.util.ArrayList<E> list = new java.util.ArrayList<E>();
    Class<E> classE;

    public Heap(E[] objects) {
        Class<? extends Object[]> aClass = objects.getClass();
        this.classE = (Class<E>) aClass.getComponentType();
        for (int i = 0; i < objects.length; i++) {
            add(objects[i]);
        }
    }

    private  void add(E newObject){
        ...
    }

    @Override
    protected Heap<E> clone() {
        return new Heap<E>(list.toArray((E[])Array.newInstance(classE, list.size())));
    }
}
于 2013-02-22T07:25:22.073 に答える
-1
 return new Heap<E>((E[])list.toArray());

いいえ、配列は型キャストできません (まあ、からのみObject)。

代わりに使用してください:

 return new Heap<E>(list.toArray((E[])new Comparable[0]));

(境界型の を使用すると仮定しComparable、それ以外の場合は次を使用します。

return new Heap<E>(list.toArray((E[])new Object[0]));

)

これは type の配列を返しE[]ます。

于 2013-02-22T06:56:27.790 に答える