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[]>告诉编译器应该是什么.
如果你的列表中只有一个元素,那么这Collections.singletonList(new Object[] {...})是一个更好的选择,因为它避免了varargs并使得在调用站点的行为更加明显.