2013-04-24 52 views
1

我在Java中的泛型類生成鑄錯誤:如何避免可比接口

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


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

而且我有一個錯誤

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Number; 

Erorr是這個鑄造使(T [] )new Object [10]

我需要比較方法,因爲我需要數組元素必須排序。所以我不能申報這樣的類

public class PriorityList<T extends Number> 

其他選項至少有一些意義是由我自己的鏈表,以保持T值。但是是另一種解決這個鑄造問題的方法

(T [])new Object [10];

PS 收集frobiden使用。

+1

@RonDahlgren說到這一點,我有一本舊的Java書(Java 1.1),它說你應該放棄不必要的轉換並且只投射一次是因爲存儲在一個參考文獻中,並且獲取參考比鑄造花費的時間少。 – gparyani 2013-04-24 18:28:28

+1

數組,泛型和類型安全:您只能選擇兩個。 – 2013-04-24 18:41:36

+0

@gparyani好點。根據他的收藏的使用模式,保留已經鑄造的頭部參考可能是有意義的 – 2013-04-24 20:24:57

回答

0

無法將Object的數組投射到Number的數組中,因爲Object數組可以包含任何類型的對象 - 不僅包含T類型的對象。但new T[]由於類型錯誤而不正確 - 即java運行時不知道大約T

一種方法是製作aObject[]陣列。

另一種方法是:

public PriorityList(Class<T> type) { 
    T[] a = (T[])Array.newInstance(type, 10); 
} 

或者,正如提到 - 使用Java集合 - 他們更通用的友好。

+0

查看稿後文稿。 – Aku 2013-04-24 18:25:00

+0

好吧,'Array.newInstance'應該滿足你的需求..我前段時間更新。現在檢查。 – acc15 2013-04-24 18:28:02

0

您不能將保留數組轉換爲未知類型的數組。我建議您以這種方式使用T對象的陣列工廠:

public interface ArrayFactory<T extends Number> { 
    T[] create(int size); 
} 

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

    private ArrayFactory<T> factory=...; 
    T[] array = factory.create(10); 

然後,您可以爲PriorityList提供ArrayFactory的實現。

希望這會有所幫助。

0

是一個對象,但對象不是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; 
    } 
0

只需將其改變爲

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

由於T的下界Comparable,流延到T[]實際上導致的鑄造到Comparable[]。這是你看到失敗的演員,因爲Object[]沒有投射到Comparable[]

0

T的擦除是數字,因此:

Number[] array = new Number[10]; 

將讓你足夠接近。可以將該數組的任何子類(例如,任何T)存儲在該數組中。 (注意:這也應該解釋爲什麼投給(T[])new Object[10]又名(Number[])new Object[10]會導致異常。)