2013-02-22 111 views
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()); 
    } 
} 
+3

請告訴我這段代碼的問題? – Shivam 2013-02-22 06:54:13

+1

你在哪裏得到ClassCastException?至少提供的數組元素應該實現Comparable接口。 – 2013-02-22 06:55:14

+0

你忘了告訴我們在哪裏發生異常......它在克隆中,對嗎? – home 2013-02-22 06:59:51

回答

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

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

+1

新'新E [0]'不會編譯,因爲你不能實例化泛型數組。 – home 2013-02-22 06:58:40

+0

@home看到編輯... – Mordechai 2013-02-22 07:05:17

+0

謝謝...順便說一句 - 我沒有downvote。 – home 2013-02-22 07:08:13

1

有效的Java由Joshua布洛赫(項目25):

是非法的創建一個通用類型,參數化類型,或一種類型的參數的陣列。這些數組創建表達式都不是合法的新的List<E>[],新的List<String>[],new E[]

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