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

Dip*_*pta 15 java generics collections jvm compiler-errors

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

  List<Integer> ints= Arrays.asList(1,2,3);
Run Code Online (Sandbox Code Playgroud)

它工作正常.

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

  List<Object> objs= Arrays.asList(1,2.13,"three");
Run Code Online (Sandbox Code Playgroud)

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

  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
Run Code Online (Sandbox Code Playgroud)

相反,如果我写

  List<Object> objs = Arrays.<Object>asList(1,2.13,"three");
Run Code Online (Sandbox Code Playgroud)

它工作正常.

我无法弄清楚原因.

UmN*_*obe 14

请看stackoverflow上的这篇文章.

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

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

最具限制性的类型交集String,Double并且Integer是接口ComparableSerializable.所以当你写作

Arrays.asList(1,2.13,"three"); 
Run Code Online (Sandbox Code Playgroud)

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

List<Object> objs = new List<T extends Comparable<?>, Serializable>
Run Code Online (Sandbox Code Playgroud)

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

Arrays.<Object>asList(1,2.13,"three");
Run Code Online (Sandbox Code Playgroud)

没有推论