特定的Java通用数组创建

时间:2013-01-09 14:48:22

标签: java

  

可能重复:
  Java 1.6: Creating an array of List<T>

如何在Java中初始化此数组。

Vector<Integer>[] c;

我已经尝试过了:

Vector<Vector<Integer>[]> a = new Vector<Vector<Integer>[]>();
Vector<Integer>[] c = (Vector<Integer>[])a.toArray();

出现以下错误:

  

线程“main”中的异常java.lang.ClassCastException:   [Ljava.lang.Object;无法转换为[Ljava.util.Vector;在   app.Program.main(Program.java:38)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

编辑:

我的问题是我是一个接收通用数组“T [] args”参数的类的客户端,在我的情况下T是一个泛型类型,如Vector,谢谢

我是Java新手。

4 个答案:

答案 0 :(得分:4)

我认为你不能创建一系列泛型。 看一下这个。 Java 1.6: Creating an array of List<T>

这是因为类型信息在运行时不可用。

答案 1 :(得分:2)

如果可以避免,我不会使用Vector。它在Java 1.2(1998)

中被ArrayList取代
List<List<Integer>[]> a = new ArrayList<List<Integer>[]>();
List<Integer>[] c = (List<Integer>[]) a.toArray(new List[a.size()]);

toArray()仅返回Object[],无法向下转换为特定的数组类型。

BTW如果效率是一个问题,我会避免在集合中使用Integer。你可以用trove代替。 TIntArrayListint[]

的包装器
List<TIntArrayList> a = new ArrayList<>();
TIntArrayList[] c = a.toArray(new TIntArrayList[a.size()]);

答案 2 :(得分:1)

这是一个向量数组:

    Vector<Integer>[] c = new Vector[2];
    c[0] = new Vector<Integer>();
    c[0] = new Vector<Object>(); // <- compiletime error
    c[0].add(new Integer(0));

我们无法创建“通用数组”。但上面的行创建了一个可容纳 size 向量的数组。每个数组插槽都可以保存对参数Vector的引用。

我们看到,即使数组本身不是通用的,变量c也被声明为泛型类型,这迫使我们只将Vector<Integer>个实例放到数组中。

因此,如果忽略某些警告,我们可以向数组中添加其他向量...

    Vector[] b = c;                    // <- warning
    Vector<Double>[] a = b;            // <- warning
    a[1] = new Vector<Double>();       // <- the array itself allows that
    a[1].add(new Double(0));

    for (Vector<Integer> vector : c) {
        Integer value = vector.get(0); // <- BOOM! (on second iteration)
    }

答案 3 :(得分:1)

您可以删除通用声明

Vector[] c = new Vector[10];

或者用另一个向量或列表类型替换数组

List<Vector<Integer>> list = new ArrayList<Vector<Integer>>();