编译错误:通用数组创建

时间:2011-10-23 01:32:27

标签: java

我想创建一个ArrayList<String>的数组。我尝试了以下方法:

static ArrayList<String>[] displayBlocks = new ArrayList<String>[3];

但是,我收到编译时错误:

  

通用数组创建

我添加了import java.util.*;。我怎样才能编译它?

5 个答案:

答案 0 :(得分:10)

如果你想要一个arraylist数组:

import java.util.ArrayList;
import java.util.List;

public class Foo{

    List [] arrayOfLists = new ArrayList[10];


}

这是一个相关的post。你不能创建一个通用的arraylist数组。 你可以这样做:

import java.util.ArrayList;
import java.util.List;

public class Foo{

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


}

答案 1 :(得分:5)

在Java中确实不允许使用此构造。你可以使用varargs hack:

static List<String>[] displayBlocks = createArray(3);

public static <E> E[] createArray(int length, E... elements) {
    return Arrays.copyOf(elements, length);
}

毋庸置疑,List<List<String>>更好,除非你对内存非常紧张,但我想知道为什么你不使用String[][]

答案 2 :(得分:2)

另一方面的一方也可以创建这样的列表,这可能会让人感觉更熟悉

static ArrayList<String>[] displayBlocks = (ArrayList<String>[]) new ArrayList[3];

答案 3 :(得分:0)

来自Java Language Specification section on array creation expressions

  

如果ClassOrInterfaceType不表示可重新类型(第4.7节),则为编译时错误。 。 。 。上述规则意味着数组创建表达式中的元素类型不能是参数化类型,而不是无界通配符。

像其他人所说的那样,使用ArrayLists的ArrayList,或者使用强制转换(你可能还希望抑制未经检查的转换警告)。

答案 4 :(得分:-1)

你做错了什么:

您尚未创建对象。请记住,在java

1)所有对象都有构造函数。 2)构造函数是方法。 3)要创建一个对象,必须调用构造函数,因此,您正在调用一个方法!

你的欲望含糊不清。但是阅读这两个答案会很好:

1)您可以创建一个数组列表数组:这是一个包含10个数组列表的数据结构。它本质上是一个二维数组,其中每行的列数是可变的,但只有10行。

这将是一个奇怪的数据结构。例如,它可能代表一个域模型,其中您只有10个人,并且每个人在其DVD集合中都有可变数量的dvds。所以你会有10行,每行都有一个数组列表。

static ArrayList [] displayBlocks = new ArrayList [10];

  • 不是说这里没有(),只是一个[] *这是因为我们没有填充我们的数组,而是我们只声明有一个包含10个插槽的数组,每个插槽都有“ArrayList”类型。要填充,您必须迭代并添加displayBlock [0] = new ArrayList(),为0-9。

2)可能你只想要一个简单的数组列表,它是一个项目的线性集合。

要做到这一点,你只需声明:

Collection a = new ArrayList(); //要么 列出a = new ArrayList();

现在......你应该问问自己为什么你可以将变量声明为Collection或List,如果你想真正java的集合工作的话。