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

时间:2012-03-30 11:56:38

标签: java generics collections jvm compiler-errors

我想要两个列表: 首先是整数列表。我认为它是:

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

工作正常。

其次是对象列表。我声明为:

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

但是一旦我写它就会在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

相反,如果我写

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

工作正常。

我无法找出原因。

2 个答案:

答案 0 :(得分:14)

请看this post on stackoverflow

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

  

超类型约束T:&gt; X暗示解决方案是其中之一   X的超类型。鉴于对T的几个这样的约束,我们可以相交   每个约束所暗示的超类型集合,因为   type参数必须是所有这些的成员。然后我们可以选择   交叉点中最具体的类型

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

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");

没有推论

答案 1 :(得分:2)

使用此作品完美

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

System.out.println(objs);

输出: [10,20.32,测试]