为什么可以';t Java转换ArrayList<;TreeSet<;整数>&燃气轮机;进入列表<;设置<;对象>>;?
我试图做一些看起来相当简单的事情:对集合列表的大小求和。Netbeans发出以下警告/错误:为什么可以';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
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.
}