简洁、无警告、通用列表声明?
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, ""));
// ...
}};
在声明点和使用点,在 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, "")); // ... }};