为什么通用列表的声明有所不同?

我想去掉两个列表:第一个是整数列表。我把它贬低为:

  List<Integer> ints= Arrays.asList(1,2,3);

它工作正常。

第二个是对象列表。我声明为:

  List<Object> objs= Arrays.asList(1,2.13,"three");

但是一旦我写它,它就给出了一个错误。错误是:

  Multiple markers at this line
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
 List<Object>
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for
       a varargs parameter

相反,如果我写

  List<Object> objs = Arrays.<Object>asList(1,2.13,"three");

它工作正常。

我无法找出原因。


答案 1

看看这篇关于stackoverflow的文章

15.12.2.7 根据实际参数推断类型参数

超类型约束 T :> X 意味着解是 X 的超类型之一。给定 T 上的几个这样的约束,我们可以将每个约束所隐含的超类型集相交,因为类型参数必须是所有这些约束的成员。然后,我们可以选择交叉点中最具体的类型

和 之间限制性最严格的类型交集是 接口 和 。所以当你写作时StringDoubleIntegerComparableSerializable

Arrays.asList(1,2.13,"three"); 

它推断是.然后就好像你正在做Timplements Comparable<?>, Serializable

List<Object> objs = new List<T extends Comparable<?>, Serializable>

显然,这是不允许的。
另一方面,当您显式指定使用Object

Arrays.<Object>asList(1,2.13,"three");

不做任何推断


答案 2

使用这个工作完美

List<? extends Object> objs = Arrays.asList(10,20.32,"test");

System.out.println(objs);

输出: [10, 20.32, 测试]