关于ArrayList <integer> [] x </integer>的Java问题

时间:2011-03-11 11:21:12

标签: java arrays generics arraylist

我一直遇到ArrayLists数组的这个问题。也许你可以提供帮助。

//declare in class
private ArrayList<Integer>[] x;

//in constructor
x=new ArrayList[n];

这会生成有关未选中转化的警告。

但是

x=new ArrayList<Integer>[n];

是编译错误。

有什么想法吗?

谢谢!

6 个答案:

答案 0 :(得分:5)

您无法创建一系列泛型列表。幸运的是,有一些解决方法。更幸运的是,有一个关于Generics的好网站提供的信息比您想知道的要多。该链接直接指向Java Generics部分中的Arrays。

答案 1 :(得分:3)

我认为你不能制作通用arraylist数组,因为在运行时没有通用的信息。相反你可以这样做:

List<Integer>[] arr=new ArrayList[30];
arr[0]=new ArrayList<Integer>();//create new arraylist for every index.

答案 2 :(得分:0)

ArrayList<?>[] x;
x=(ArrayList<? extends Integer>[]) new ArrayList<?>[10];
x[0] = new ArrayList(1);

答案 3 :(得分:0)

运行流动的代码:

public class Test {
    ArrayList<Long>[] f0;
    ArrayList<Long> f1;
    ArrayList[] f2;
    public static void main(String[] args) {
        Test t = new Test();
        Field[] fs = t.getClass().getDeclaredFields();
        for(Field f: fs ){
            System.out.println(f.getType().getName());
        }

    }

}

你会得到:

[Ljava.util.ArrayList;
java.util.ArrayList
[Ljava.util.ArrayList;

因为Java不支持通用数组。当你声明:

private ArrayList<Integer>[] x;

编译器会认为它是:

private ArrayList[] x;

所以,你应该这样做:

int n = 10;
ArrayList<Long>[] f = new ArrayList[n];
for(int i=0;i<n;i++){
    f[i] = new ArrayList<Long>();
}

答案 4 :(得分:0)

这不应该是一个错误。警告就足够了。如果没有人可以创建ArrayList<Integer>[],那么实际上没有必要允许该类型。

由于javac不对我们有帮助,我们可以自己创建数组:

@SuppressWarnings("unchecked")
<E> E[] newArray(Class<?> classE, int length)
{
    return (E[])java.lang.reflect.Array.newInstance(classE, length);
}

void test()
    ArrayList<Integer>[] x;
    x = newArray(ArrayList.class, 10);

类型约束并不完美,调用者应该确保传入确切的类。好消息是如果传入了错误的类,则在将结果分配给x时会立即发生运行时错误,所以它快失败了。

答案 5 :(得分:0)

好吧,您似乎只想编写

就可以避免有关泛型的警告

ArrayList[] x=new ArrayList[n];

以及删除x=new ArrayList<Integer>[n];

的编译错误

您可以使用通用类型<?>来满足这两个条件,例如:

ArrayList<?> x[]=new ArrayList[n];

您可能想参考以下链接以了解有关泛型的更多信息: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html