2017-03-07 39 views
1

什麼是tersest在Java中聲明一個列表/數組字面值的方法,無論是在聲明點還是使用點?Terse,免警通用清單聲明?

作爲一個次要問題,我更喜歡一種不會導致編譯時警告或需要禁止警告的方法。

注:個人而言,這是Java 8ish on Android,因此更改答案。

我已經試過:

// error: generic array creation 
    Pair<Integer, String>[] data4 = new Pair<Integer, String>[] { 
      new Pair<Integer, String>(0, "00000000"), 
      new Pair<Integer, String>(1, "00000001"), 
      new Pair<Integer, String>(127, "11111111"), 
      new Pair<Integer, String>(128, "10000000") 
    }; 
// warning: unchecked assignment 
    Pair<Integer, String>[] data4 = new Pair[] { 
      new Pair<Integer, String>(0, "00000000"), 
      new Pair<Integer, String>(1, "00000001"), 
      new Pair<Integer, String>(127, "11111111"), 
      new Pair<Integer, String>(128, "10000000") 
    }; 
    for (Pair<Integer, String> x : data4) { 
    } 
Pair[] data5 = new Pair[] { 
      new Pair<Integer, String>(0, "00000000"), 
      new Pair<Integer, String>(1, "00000001"), 
      new Pair<Integer, String>(127, "11111111"), 
      new Pair<Integer, String>(128, "10000000") 
    }; 
    // warning: unchecked assignment 
    for (Pair<Integer, String> x : data5) { 
    } 
    for (Pair x : data5) { 
     //warning: unchecked assignment 
     Pair<Integer, String> y = x; 
    } 
// warning: unchecked generics array creation for vargs parameter 
    List<Pair<Integer, String>> data = Arrays.asList(
      new Pair<Integer, String>(0, "00000000"), 
      new Pair<Integer, String>(1, "00000001"), 
      new Pair<Integer, String>(127, "11111111"), 
      new Pair<Integer, String>(128, "10000000") 
    ); 
    for (Pair<Integer, String> x : data) { 
    } 
List<Pair> data2 = Arrays.asList(
      (Pair) new Pair<Integer, String>(0, "00000000"), 
      (Pair) new Pair<Integer, String>(1, "00000001"), 
      (Pair) new Pair<Integer, String>(127, "11111111"), 
      (Pair) new Pair<Integer, String>(128, "10000000") 
    ); 
    // warning: unchecked assignment 
    for (Pair<Integer, String> x : data2) { 
    } 
    for (Pair x : data2) { 
     // warning: unchecked assignment 
     Pair<Integer, String> y = x; 
    } 
+0

使用4'名單<對<整數,字符串>>數據= Arrays.asList'樣品(jdk1.8.0_91時,我沒有看到任何警告) 。 –

回答

2

直走,折扣使用raw types的任何選擇。

然後打折混合泛型和數組。

,基本上離開

List<Pair<Integer, String>> data = Arrays.asList(...); 

有一些方法來避免此警告:

  • 禁止它。 (如@SuppressWarnings("unchecked")
  • 不要試圖立即添加元素:

    List<Pair<Integer, String>> data = new ArrayList<>(); 
    data.add(new Pair<>(1, "")); 
    // ... 
    
  • 使用像番石榴的ImmutableList.of(不通用陣列只能達到11個參數):

    List<Pair<Integer, String>> data = ImmutableList.of(
        new Pair<>(1, ""), 
        // ... 
        ); 
    
  • 創建一個「加法器」類,如下所示:

    class ListAdder<T, L extends List<T>> { 
        L list; 
    
        ListAdder(L list) { this.list = list; } 
    
        L list() { return list; } 
    
        ListAdder<T> add(T item) { list.add(item); return this; } 
    } 
    

    ,並用它喜歡:

    List<Pair<Integer, String>> list = 
        new ListAdder<>(new ArrayList<Pair<Integer, String>>()) 
         .add(new Pair<>(1, "")) 
         // ... 
         .list(); 
    
  • 如果必須,您可以使用雙大括號初始化 - 但你必須知道它的問題(如它是容易出現內存泄漏,它創建了一個額外的類,等等等等):

    List<Pair<Integer, String>> data = new ArrayList<Pair<Integer, String>>() {{ 
        add(new Pair<>(1, "")); 
        // ... 
    }}; 
    
+0

謝謝!甚至在發佈問題之前,我剛剛解決了'Arrays.asList'並抑制了警告。我不喜歡這樣做,想要一個「更好」的解決方案,但它看起來並不像。其他一切都太垃圾!它在測試代碼中,所以我並不在乎。在真正的代碼中,我可能會選擇'.add'。 – Pod