[英]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>[]
,newList<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.