Terse,无警告,通用列表声明?

时间:2017-03-07 11:49:10

标签: java list generics compiler-errors compiler-warnings

在声明和使用点声明Java中的列表/数组文字的 tersest 方式是什么?

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

注意:就个人而言,这是Java 8ish on Android,更改答案。

我试过了:

NativeScript
    // 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) {
    }

1 个答案:

答案 0 :(得分:2)

直接离开,对任何使用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 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, ""));
      // ...
    }};