为什么通用列表声明的区别?

我想要两个列表:第一个是整数列表。 我认为它是:

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

它工作正常。

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

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

但是一旦我写它就会在eclipse中出错。 错误是:

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

相反,如果我写

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

它工作正常。

我无法弄清楚原因。

请看stackoverflow上的这篇文章 。

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

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

StringDoubleInteger之间最严格的类型交集是ComparableSerializable接口。 所以当你写作

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

它推断T implements Comparable, Serializable 。然后就好像你在做

 List objs = new List, Serializable> 

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

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

没有推论

使用这个作品完美

 List objs = Arrays.asList(10,20.32,"test"); System.out.println(objs); 

输出: [10,20.32,测试]