无法初始化 List<Object[]> Using Arrays.asList

2022-09-03 16:57:27

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

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

但是当我想使用简化它时:Arrays.asList

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

它无法编译,出现错误:

incompatible types: inference variable T has incompatible bounds
equality constraints: java.lang.Object[]
lower bounds: java.lang.Object

为什么它不能正确地进行类型推断以及如何解决这个问题?


答案 1

请记住,这只是数组参数的语法糖。您可以使用以下任一方式调用具有可变参数的方法...foo(Object...)

foo("hello", 1);

foo(new Object[]{"hello", 1});

因为编译器无论如何都会构造第二种形式。

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

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

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

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

或者,如果您不需要列表可变:

List<Object[]> bar = Collections.singletonList(new Object[]{"bar", 286});

答案 2

将引用类型的数组传递给该引用类型时,将获得该引用类型的 。Arrays.asListList

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