为什么可以';t Java转换ArrayList<;TreeSet<;整数>&燃气轮机;进入列表<;设置<;对象>>;?

为什么可以';t Java转换ArrayList<;TreeSet<;整数>&燃气轮机;进入列表<;设置<;对象>>;?,java,generics,Java,Generics,我试图做一些看起来相当简单的事情:对集合列表的大小求和。Netbeans发出以下警告/错误: actual argument java.util.ArrayList<java.util.TreeSet<java.lang.Integer>> cannot be converted to java.util.List<java.util.Set<java.lang.Object>> by method invocation conversion

我试图做一些看起来相当简单的事情:对集合列表的大小求和。Netbeans发出以下警告/错误:

actual argument java.util.ArrayList<java.util.TreeSet<java.lang.Integer>> cannot be    converted to java.util.List<java.util.Set<java.lang.Object>> by method invocation conversion

那么,为什么不能将java.lang.Integer转换为java.lang.Object呢?

A
List
不是
List
。如果
Java
允许这样做,那么您可以使用
List
调用该方法,您将被破坏。正如
Jeremy Heiler
所指出的,您可以使用
List任何声明为泛型类型的内容必须始终是完全相同的泛型类型。唯一可以改变的是基本类型,即:

List<MyObject> myList = new ArrayList<MyObject>;
List myList=new ArrayList;
这是因为,例如,如果您将一个参数声明为
List
,并且可以向其传递
List
,则可以向该列表添加任何类型的对象,这将破坏类型安全性


尽管使用通配符
有一个解决办法,但除非您这样做,否则您仍然无法添加元素
问题不是从整数转换为对象,而是从整数列表转换为对象列表,这会失败,因为
列表
不是
列表
。Java编译器不会尝试自动强制转换泛型类型

您可以将方法声明更改为类似以下内容以避免出现错误:

public static int sizeOfListOfSets(List<Set<? extends Object>> list)

public static int-sizeOfListOfSets(List),因为这将使您能够将任何对象放入该列表中。当您稍后从原始列表引用访问元素时,它将包含非整数对象,尽管该列表仍然声明为
List
,这意味着您不能再依赖该类型所表示的内容。例如:

List<Integer> intList = new ArrayList<Integer>();
doSomething(intList);
for (Integer i : intList) {
    // i must be an Integer, so doSomething must not
    // be able to put non-Integers into that list.
}
List intList=new ArrayList();
剂量测定法(intList);
for(整数i:intList){
//我必须是一个整数,所以doSomething不能
//能够将非整数放入该列表中。
}

正确的问题标题应该是,“为什么Java不能将
数组列表
转换为
列表
?”然而,
列表
列表使用
设置
List@Petar:您在注释中提供的解决方案是可行的,但解释(为什么Java不允许这样做)不正确。调用
sizeOfListOfSets(列表)
使用
列表不会导致任何概念上的问题。只有当方法修改参数对象时,问题才会出现。@Chris:调用
sizeoflist(列表)带有
列表的
将导致编译时错误。有关详细信息,请参阅。这仍然会导致错误,但是
公共静态int-sizeoflist(列表>列表)
没有。感谢您的回复。@houman001-它必须是
列表
List<MyObject> myList = new ArrayList<MyObject>;
public static int sizeOfListOfSets(List<Set<? extends Object>> list)
List<Integer> intList = new ArrayList<Integer>();
doSomething(intList);
for (Integer i : intList) {
    // i must be an Integer, so doSomething must not
    // be able to put non-Integers into that list.
}