2017-03-07 3 views
1

はなんですか?宣言のポイントと使用場所の両方で、リスト/配列リテラルをJavaで宣言する方法はありますか?簡潔で警告のないジェネリックリスト宣言?

2番目の懸案事項として、私は、コンパイル時の警告を発生させないか、または警告を抑制する必要があるメソッドを好むでしょう。

注:これは個人的には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

第四 '一覧<ペア<整数、文字列>>データ= 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

関連する問題