14

如何初始化Arrayof ArrayList<String>

我尝试了这种语法,但没有奏效:

ArrayList<String>[] subsection = new ArrayList<String>[4];
4

4 回答 4

12

你可以这样定义:

ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10];
    lists[0] = new ArrayList<String>();
    lists[0].add("Hello");
    lists[0].add("World");
    String str1 = lists[0].get(0);
    String str2 = lists[0].get(1);
    System.out.println(str1 + " " + str2);
于 2012-04-19T11:44:44.367 回答
11

该语法适用于非泛型ArrayList. (想法)

但它不适用于通用ArrayList<E>(ideone)

这段代码:

ArrayList<String>[] subsection = new ArrayList<String>[4];

给出编译器错误:

Main.java:8:通用数组创建
        ArrayList<String>[] 小节 = new ArrayList<String>[4];

对于通用版本,请使用ArrayList<ArrayList<E>>

ArrayList<ArrayList<String>> subsection = new ArrayList<ArrayList<String>>();
于 2012-04-19T11:40:30.450 回答
6

好的,评论后,我想得很好......你的权利,为什么不呢。

弄清楚了。

ArrayList[] test = new ArrayList[4];

test[3] = new ArrayList<String>();
test[3].add("HI");

System.out.println(test[3].get(0));

虽然我会说实话,但我不确定为什么会这样。

一旦您将测试的第一项分配为新集合,它将只允许数组中的所有其他项为该类型。所以你做不到

test[3] = new ArrayList<String>();
test[2] = new HashSet<String>();
于 2012-04-19T13:09:05.737 回答
1

将泛型视为类型澄清过程,您可以将类型化值分配给原始类型的变量,反之亦然。在核心泛型是程序员避免过多类型转换的捷径,这也有助于在编译时捕获一些逻辑错误。在最基本的情况下,ArrayList 将始终隐式包含 Object 类型的项目。

所以

test[i] = new ArrayList<String>(); because test[i] has type of ArrayList.

test[3] = new ArrayList<String>();
test[2] = new HashSet<String>();

没有工作 - 正如预期的那样,因为 HashSet 根本不是 ArrayList 的子类。泛型在这里无关。去掉泛型,你会看到明显的原因。

然而,

test[2] = new ArrayList<String>();
test[3] = new ArrayList<HashSet>(); 

会很好地工作,因为这两个项目都是 ArrayLists。

希望这是有道理的...

于 2012-05-29T03:12:57.833 回答