在声明和使用点声明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) {
}
答案 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, ""));
// ...
}};