简洁、无警告、通用列表声明?

Terse, warning-free, generic list declaration?

在声明点和使用点,在 Java 中声明 list/array 文字的 最简洁 方法是什么?

作为次要问题,我更喜欢一种不会导致编译时警告或不需要警告被抑制的方法。

注意:就我个人而言,这是针对 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;
    }

立即对任何使用 raw types 的选项打折。

然后打折混合泛型和数组的那些。

那基本上就剩下

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

有几种方法可以避免此处的警告:

  • 抑制它。 (例如 @SuppressWarnings("unchecked")
  • 不要尝试立即添加元素:

    List<Pair<Integer, String>> data = new ArrayList<>();
    data.add(new Pair<>(1, ""));
    // ...
    
  • 使用类似 Guava 的 ImmutableList.of(在没有通用数组的情况下最多只有 11 个参数):

    List<Pair<Integer, String>> data = ImmutableList.of(
        new Pair<>(1, ""),
        // ...
        );
    
  • 创建一个 "adder" class,类似于:

    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();
    
  • 如果你必须,你可以使用双括号初始化 - 但你必须意识到它的问题(比如它容易出现内存泄漏, 它会创建一个额外的 class, 等等):

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