我有关于创建新数组列表的问题。
如果我使用
创建一个新的ArrayList <?> listtwo = new ArrayList<?>();
我可以在阵列中添加什么?我可以把字符串和整数放进去吗? 或者这是如何工作的。
我知道如果您创建一个列表:
ArrayList<String> list =new ArrayList<String>();
您只能将Strings
放入其中。如果你尝试做别的事情就会产生编译异常。
答案 0 :(得分:2)
如果我使用
创建一个新的ArrayList <?> listtwo = new ArrayList<?>();
你做不到。您无法在没有边界的情况下实例化参数化类型。这是编译器会说的内容:
ArrayList <?> listtwo = new ArrayList<?>(); ^ required: class or interface without bounds found: ?
所以你可以放入什么的问题没有实际意义。
如果您根本没有提供类型参数:
ArrayList listtwo = new ArrayList();
...你可以把任何你喜欢的东西放进去(包括各种各样的东西)。原始值将被强制转换为它们的对象等价物(int
=&gt; Integer
等)。那时,它基本上是一个ArrayList<Object>
实例。
答案 1 :(得分:0)
这里有两个问题。
(a)new ArrayList<?>
不是法律表达。
如果要创建一个可以容纳字符串和整数的列表,则需要使用ArrayList<Object>
,因为Object
是String
和{{最常见的超常类型} Integer
1}}:
ArrayList<Object> list = new ArrayList<Object>;
list.add('abcd'); // insert a string
list.add(1234); // insert an integer
不利的一面是,当您从此列表中提取项目时,它将是Object
类型,因此您需要向下转发它:
String s = (String) list.get(0);
Integer n = (Integet) list.get(1);
(b)关于通配符?
符号:
它可用于指定变量的类型,如:ArrayList<?> list = ...
但不能在new
表达式中使用。换句话说,这个表达是非法的:new ArrayList<?>
。
通配符对于允许列表之间的(有限的)多态性很有用。具体来说,如果您有一个Integer
的列表,并且您希望将其视为Number
的列表(这是有意义的,因为Integer
是Number
的子类)您可以使用通配符。
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(100);
list2.add(200);
// This assignment is OK:
ArrayList<? extends Number> list3 = list2;
Number n = list3.get(0); // n is now 100
但是,list3(或带有通配符类型的任何其他列表)的问题在于您无法改变它。例如,如果您尝试将元素添加到此列表中:
list3.add(300); // <-- This is not allowed
您将收到编译时错误。