创建一个新的ArrayList

时间:2014-07-05 10:02:04

标签: java arraylist

我有关于创建新数组列表的问题。

如果我使用

创建一个新的
ArrayList <?> listtwo = new ArrayList<?>();

我可以在阵列中添加什么?我可以把字符串和整数放进去吗? 或者这是如何工作的。

我知道如果您创建一个列表:

ArrayList<String> list =new ArrayList<String>(); 

您只能将Strings放入其中。如果你尝试做别的事情就会产生编译异常。

2 个答案:

答案 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>,因为ObjectString和{{最常见的超常类型} 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的列表(这是有意义的,因为IntegerNumber的子类)您可以使用通配符。

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

您将收到编译时错误。