Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么通用列表的声明不同?_Java_Generics_Collections_Jvm_Compiler Errors - Fatal编程技术网

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