2012-03-30 59 views
15

我想分解两个列表: 首先是一个整数列表。我decare它为:为什么泛型列表的声明有所不同?

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

它工作正常。

我无法弄清楚原因。

回答

14

this post on stackoverflow

基于实际参数15.12.2.7推断类型参数

的超类型约束T:> X意味着该解决方案是 之一X的超类型鉴于几个这样的约束对T,我们可以相交 由每个约束隐含的超类型集合,因为 类型参数必须是它们全部的成员。然后,我们可以选择最 特定类型是在路口

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

没有推理由

+0

明白了。感谢非常好的解释。如果出现这种混淆,这将是一个适用的金科玉律。 – 2012-03-30 12:29:31

2

使用此作品完美

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

System.out.println(objs); 

输出: [10,20.32,测试]

+3

这没什么,但请注意,就编译器而言,'List '与* List不同*?扩展Object>',而OP可能需要一个'List ' – Bohemian 2012-03-30 12:10:23

+1

-1正如OP所述,'数组。 asList(1,2.13,“three”)'很好。问题是为什么编译器无法推断Object,而不是如何破解解决方案。 – 2012-03-30 18:18:56

相关问题