麻烦初始化List <Object []>使用Arrays.asList

qqi*_*row 13 java generics list

当我初始化List时,我能够这样做:

List<Object[]> foo = new ArrayList<>();
foo.add(new Object[]{816, "foo", 2.6});
Run Code Online (Sandbox Code Playgroud)

但是,当我想使用Arrays.asList以下方法简化它时:

List<Object[]> bar = Arrays.asList(new Object[]{"bar", 286});
Run Code Online (Sandbox Code Playgroud)

它无法编译错误:

incompatible types: inference variable T has incompatible bounds
equality constraints: java.lang.Object[]
lower bounds: java.lang.Object
Run Code Online (Sandbox Code Playgroud)

为什么它不能做类型推断权以及如何解决这个问题?

Era*_*ran 13

传递引用类型数组时,Arrays.asList您将获得List该引用类型.

因此Arrays.asList(new Object[]{"bar", 286})返回a List<Object>,而不是a List<Object[]>.


And*_*ner 12

请记住,这...只是数组参数的语法糖.你可以调用的方法与参数可变参数,foo(Object...)或者使用

foo("hello", 1);
Run Code Online (Sandbox Code Playgroud)

要么

foo(new Object[]{"hello", 1});
Run Code Online (Sandbox Code Playgroud)

因为编译器无论如何构造第二个表单.

因为编译器推断类型时不考虑接收器类型,所以它会查看Arrays.asList(new Object[]{"bar", 286})并认为您的意思是创建一个列表Object,而不是单个列表Object[].

使用现有语法的最简单方法是添加显式类型参数:

List<Object[]> bar = Arrays.<Object[]>asList(new Object[]{"bar", 286});
Run Code Online (Sandbox Code Playgroud)

添加<Object[]>告诉编译器应该是什么.


Dan*_*den 7

如果你的列表中只有一个元素,那么这Collections.singletonList(new Object[] {...})是一个更好的选择,因为它避免了varargs并使得在调用站点的行为更加明显.