【问题标题】:Specific Java generic array creation [duplicate]特定的Java泛型数组创建[重复]
【发布时间】:2013-01-09 14:48:22
【问题描述】:

可能重复:
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();

出现以下错误:

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

编辑:

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

我是 Java 新手。

【问题讨论】:

  • 你想完成什么? Vector 和 Array 在概念上是相似的,但它们并不完全相同。你真的想创建一个包含整数数组的向量吗?
  • 如果使用集合,为什么要使用数组?根据您的要求,您似乎想要一个向量数组。向量列表不是更有意义吗?很难说没有你为什么想要一个数组的细节。
  • @Aaron Kurtzhals 不,我正在尝试创建一个泛型类型的数组。

标签: java


【解决方案1】:

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

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

【讨论】:

    【解决方案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[],它不能向下转换为特定的数组类型。

    顺便说一句,如果效率是一个问题,我会避免在集合中使用整数。你可以用 trove 代替。 TIntArrayListint[] 的包装器

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

    【讨论】:

      【解决方案3】:

      您可以删除通用声明

      Vector[] c = new Vector[10];
      

      或者将数组替换为其他向量或列表类型

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

      【讨论】:

        【解决方案4】:

        这是一个向量数组:

            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&lt;Integer&gt; 实例放入数组。

        所以我们可以在数组中添加其他向量,如果我们忽略一些警告...

            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)
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-06
          • 2021-10-09
          • 1970-01-01
          • 2011-12-24
          • 1970-01-01
          • 2011-07-23
          • 1970-01-01
          • 2011-10-27
          相关资源
          最近更新 更多