Java 为什么通用列表的声明不同?
我想对两个列表进行分解: 第一个是整数列表。我认为:Java 为什么通用列表的声明不同?,java,generics,collections,jvm,compiler-errors,Java,Generics,Collections,Jvm,Compiler Errors,我想对两个列表进行分解: 第一个是整数列表。我认为: List<Integer> ints= Arrays.asList(1,2,3); List ints=Arrays.asList(1,2,3); 它很好用 第二个是对象列表。我宣布: List<Object> objs= Arrays.asList(1,2.13,"three"); List objs=Arrays.asList(1,2.13,“三”); 但我一写它,它就在eclipse中给出了一个错
List<Integer> ints= Arrays.asList(1,2,3);
List ints=Arrays.asList(1,2,3);
它很好用
第二个是对象列表。我宣布:
List<Object> objs= Arrays.asList(1,2.13,"three");
List objs=Arrays.asList(1,2.13,“三”);
但我一写它,它就在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
此行有多个标记
-类型不匹配:无法从列表转换&已为创建Serializable
varargs参数
相反,如果我写
List<Object> objs = Arrays.<Object>asList(1,2.13,"three");
List objs=Arrays.asList(1,2.13,“三”);
它很好用
我想不出原因。看看
15.12.2.7基于实际参数推断类型参数
超类型约束T:>X意味着解决方案是
X的超型。给定T上的几个这样的约束,我们可以相交
自
类型参数必须是所有类型参数的成员。然后我们可以选择
交叉点中最特定的类型
String
、Double
和Integer
之间最严格的类型交叉点是接口compariable
和Serializable
。所以当你写作的时候
Arrays.asList(1,2.13,"three");
它将T
推断为实现了可比较、可序列化的
List<Object> objs = new List<T extends Comparable<?>, Serializable>
不作任何推断使用此项功能非常完美
List<? extends Object> objs = Arrays.asList(10,20.32,"test");
System.out.println(objs);
List这很好,但请注意,就编译器而言,List
与OP所述的List-1不同,Arrays.asList(1,2.13,“三”)
工作正常。问题是为什么编译器无法推断对象
,而不是如何破解解决方案。明白了。谢谢你非常好的解释。这将是一条黄金法则,适用于此类混乱的情况。
List<? extends Object> objs = Arrays.asList(10,20.32,"test");
System.out.println(objs);