簡體   English   中英

將通用數組傳遞給構造函數

[英]Passing a generic array to a constructor

有什么方法可以在不引發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());
    }
}

Joshua Bloch撰寫的有效Java(第25項):

創建泛型,參數化類型或類型參數的數組是非法的。 這些數組創建表達式都不是合法的new List<E>[] ,new List<String>[]new E[]

因此,請使用列表而不是具有泛型的數組。

如果您對應該進行的所有未經檢查的演員表都沒問題,請執行以下操作:

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())));
    }
}
 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]));

這將返回類型為E[]的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM