2014-01-10 95 views
0

我想爲3個ArrayLists定義一個數組,每個ArrayLists都包含一個雙數組。我用以下語法:陣列ArrayList數組的Java泛型未選中轉換警告

ArrayList<double[]> testSamples[] = new ArrayList[] { 
    new ArrayList<double[]>(), new ArrayList<double[]>(), new ArrayList<double[]>() 
}; 

然而這產生一個「警告:未經檢查]未經檢查的轉換」警告,當我編譯代碼。 注意:代碼正常工作,我只是試圖解決我的語法(正確)解決警告。由於代碼的工作,它似乎是由Java的支持,我感到困惑,爲什麼我不能寫類似(這將產生一個編譯錯誤):

ArrayList<double[]> testSamples[] = new ArrayList<double[]>[] { 
     new ArrayList<double[]>(), new ArrayList<double[]>(), new ArrayList<double[]>() 
}; 

我在做什麼錯?

+0

是的,它編譯並運行正常,但編譯器輸出給定的警告。 –

+0

您不能創建一個參數化類型的數組。查看這篇文章http://stackoverflow.com/q/18581002/1679863進一步的解釋。 –

+0

'ArrayList',需要''double'類型,由幾個'ArrayList'類型初始化? – christopher

回答

4

您隱式地將原始類型數組ArrayList轉換爲數組ArrayList<double[]> s。總而言之,你不應該這樣做。如果你知道你將有3個表,那麼你可以創建一個類來保存他們,而不是:

class Container { 
    private ArrayList<double[]> list1; 
    private ArrayList<double[]> list2; 
    private ArrayList<double[]> list3; 

    ... // constructors and whatnot 

    public ArrayList<double[]> getList(int i) { // analog of testSamples[i] 
     switch (i) { 
     case 0: 
      return list1; 
     case 1: 
      return list2; 
     case 2: 
      return list3; 
     default: 
      throw new IllegalArgumentException(); 
     } 
    } 
} 

如果列出的數量不固定在3,那麼你可以使用一個List<ArrayList<double[]>>來代替。

+1

更好的選擇。 –

+0

這對眼睛來說肯定更容易,但是集合正在循環中讀取和寫入,並且我想避免使用if/switch語句來確定要讀取/寫入哪個集合變量。如果我只寫了testSamples [i],代碼就更簡潔了。 –

+0

@JJ。看看編輯 - 現在你可以簡單地做'container.get(i)'。 – arshajii

1

這是創建參數化類型數組的常見問題。爲什麼你不能使用new來創建一個參數化類型的數組是一個很長的話題,這裏已經多次討論過;它基本上與數組如何對元素類型執行運行時檢查有關,但運行時檢查不能檢查類型參數。長話短說,某種未經檢查的警告是不可避免的(因爲它確實有可能使其違反數組類型的保證)。如果你不介意「不安全」,最好的寫法是使用通配類型而不是原始類型創建數組,並將其轉換爲適當類型的數組(是的,這是一個未經檢查的轉換):

ArrayList<double[]>[] testSamples = 
    (ArrayList<double[]>[]) new ArrayList<?>[] { ... }