2014-05-03 108 views
0

我在創建一個數組來包含我的自定義對象數組時遇到了麻煩。創建一個自定義對象數組的數組

我要創建的容器作爲可比較陣列的標準陣列出於多種原因:

  • 包含在每個自定義對象陣列必須具有不同的長度
  • 自定義對象陣列具有自動排序工具內置不適用於我希望它們適合的較大的包含陣列

自定義對象數組的工作原理已經過徹底測試。

I接收durring較大對象的創建唯一的例外是:

異常在線程 「主要」 java.lang.ClassCastException:

[Ljava.lang.Comparable;不能轉換爲[LSortedFixedCircularArray;

這裏是適用的代碼

//From SortedFixedCircularArray.java 
public class SortedFixedCircularArray<E extends Comparable<E>> 
{ 
    SortedFixedCircularArray(int fixed_capacity_in) 
    { 
     data = newArray(fixed_capacity_in); 
     front = 0; 
     rear = 0; 
     size = 0; 
     capacity = data.length; 
    } 

    @SuppressWarnings("unchecked") 
    private E[] newArray(int size) 
    { 
     return (E[]) new Comparable[size]; 
    } 
} 

//From CCArray.java 
public class CCArray <E extends Comparable<E>> 
{ 
    private SortedFixedCircularArray<E>[] data; 
    private long size; 
    private long capacity; 
    private final static long DEFAULT_CAPACITY = 15; 

    CCArray() 
    { 
     this(DEFAULT_CAPACITY); 
    } 
    @SuppressWarnings("unchecked") 
    CCArray(long initial_capacity) 
    { 
     int height = getIndices(initial_capacity)[0]+1; 
     height *= 2; 

      //!THIS IS THE PROBLEM LINE! 
     data = (SortedFixedCircularArray<E>[]) new Comparable[height]; //Unchecked Casting 

     int temp = (height/2)-1; 
     patternInit(temp); 
     capacity = initial_capacity; 
     size = 0; 
    } 
    private void patternInit(int height_in) 
    { 
     //initialize the individual arrays here 
    } 
    private int[] getIndices(long index) 
    { 
     //Return int[] with i&j indices 
    } 
} 

我假設的Java看到這個對象數組作爲對象,而不是一個對象陣列。我認爲這是一種鋸齒狀數組,但如上所述,它不能由與導致其他問題相同類型的數組組成。請幫忙。

+0

您創建了一個「Comparable」數組,但您將其轉換爲'E'。 'E'和'Comparable'不一樣,所以這沒有意義。 –

+0

我同意我的方法有點無意義,但我正在抓秸稈。我已經成功地瘋狂使用數組和泛型這樣的單維結構,所以對我來說,理由是我應該能夠創建類似的多維結構。 – Mikeologist

+0

你的'CCArray'代表一個'E [] []'。那麼爲什麼不直接使用它呢?此外爲什麼不使用集合?不,沒有真正的理由使用泛型作爲數組。 –

回答

2

只是改變你的問題的行這樣的:

// Unchecked Casting 
data = (SortedFixedCircularArray<E>[]) new SortedFixedCircularArray[height]; 

演員是可選的,這個作品也:

data = new SortedFixedCircularArray[height]; 

基本上它是一個壞主意,混合泛型和數組。

+0

您的回答是正確的;謝謝。然而,我認爲能夠混合泛型和數組是非常重要的,因爲我討厭浪費空間和線性資源。 – Mikeologist

2

您可以嘗試使用通用列表來索引所有對象,然後使用for-each循環來調用和測試它們,但是我不知道這是否適合您。
我相當肯定這是因爲你沒有從你的SortedFixedCircularArray派生出Comparable類,並且反過來導致你無法投射該類型的對象,然後將其引用到Comparable
你可以試試這個:

`class SortedFixedCircularArray<E> extends Comparable<E> { 
    //In Which This Should Now Work: 
    data = (SortedFixedCircularArray<E>[]) new Comparable[height]; 
} 
` 

這個問題也可能是因爲您引用了一個可比較的數組而不是<>,這也會導致拋出異常。

我希望這有助於:)

+0

它幫助這樣看待它,但最終這個結構的應用列表很糟糕。它會起作用,但它會破壞結構的效率;這是我的最終目標。不過謝謝你的想法。 – Mikeologist

+0

沒問題,只是想幫助:) – Cartier

0

你不能投了可比對象到SortedFixedArray,而你可以施放SortedFixedArray的可比性。 所以,你可以使用:

data = new SortedFixedCircularArray<E>[height]; 

您將有

private E[] newArray(int size) { 
    return (E[]) new Comparable[size]; 
} 

同樣的問題,你爲什麼不只是做 new E[size]

+0

...因爲這是行不通的。 –

+0

你不能直接創建一個泛型數組,你必須創建一個泛型派生類型的數組並將其轉換爲一個泛型數組。但我感謝你的努力。 – Mikeologist

+0

這就是爲什麼E []不起作用: Mikeologist