【问题标题】:Java question about ArrayList<Integer>[] x关于 ArrayList<Integer>[] x 的 Java 问题
【发布时间】:2011-03-11 11:21:12
【问题描述】:

我一直对 ArrayLists 数组有这个问题。也许你可以帮忙。

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

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

这会生成有关未经检查的转换的警告。

但是

x=new ArrayList<Integer>[n];

是编译器错误。

有什么想法吗?

谢谢!

【问题讨论】:

  • 有一大堆关于泛型和数组的问题和答案。
  • 为什么不试试 List>?
  • 这并不能完全回答您的问题,但您正在尝试使用 ArrayLists 数组,因此您可能更适合使用 Integer 数组的 LinkedList。

标签: java arrays generics arraylist


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      ArrayList<?>[] x;
      x=(ArrayList<? extends Integer>[]) new ArrayList<?>[10];
      x[0] = new ArrayList(1);
      

      【讨论】:

        【解决方案4】:

        运行流动代码:

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

        【讨论】:

          【解决方案5】:

          这不应该是一个错误。一个警告就足够了。如果没有人可以创建ArrayList&lt;Integer&gt;[],那么允许该类型确实没有意义。

          由于 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时会立即发生运行时错误,所以它是快速失败。

          【讨论】:

            【解决方案6】:

            好吧,看来您只是想在编写时避免有关泛型的警告

            ArrayList[] x=new ArrayList[n];

            以及删除x=new ArrayList&lt;Integer&gt;[n];的编译错误

            您可以使用泛型类型&lt;?&gt; 来满足这两个条件,例如:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-12
              相关资源
              最近更新 更多