【问题标题】:How to instantiate a Java array given an array type at runtime?如何在运行时实例化给定数组类型的 Java 数组?
【发布时间】:2010-09-09 19:04:42
【问题描述】:

在 Java 集合框架中,Collection 接口声明了以下方法:

<T> T[] toArray(T[] a)

返回一个包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果集合适合指定的数组,则在其中返回。否则,将使用指定数组的运行时类型和此集合的大小分配一个新数组。

如果你想实现这个方法,你将如何创建一个 a 类型的数组,只有在运行时才知道?

【问题讨论】:

    标签: java arrays collections


    【解决方案1】:
    Array.newInstance(Class componentType, int length)
    

    【讨论】:

      【解决方案2】:

      通过查看 ArrayList 是如何做到的:

      public <T> T[] toArray(T[] a) {
          if (a.length < size)
              a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
          System.arraycopy(elementData, 0, a, 0, size);
          if (a.length > size)
              a[size] = null;
          return a;
      }
      

      【讨论】:

        【解决方案3】:

        使用静态方法

        java.lang.reflect.Array.newInstance(Class<?> componentType, int length)
        

        可以在此处找到有关其使用的教程: http://java.sun.com/docs/books/tutorial/reflect/special/arrayInstance.html

        【讨论】:

          【解决方案4】:

          要创建一个泛型类型的新数组(仅在运行时知道),您必须创建一个对象数组并将其简单地转换为泛型类型,然后照样使用它。这是 Java 的泛型实现的限制(擦除)。

          T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want.
          

          然后该函数获取给定的数组 (a) 并使用它(事先检查它的大小)或创建一个新数组。

          【讨论】:

          • 与此处的所有其他答案不同,这种方式不会创建一个 T 数组。由于擦除,您可以将其分配给 T[],但您不会总是摆脱它。如果在特定实例中 T 是 String,并且您在那里创建的数组(返回到另一个方法并)分配给 String[](不需要强制转换),您将收到意外的 ClassCastException。这是类型污染的一个例子。不要这样做!
          猜你喜欢
          • 1970-01-01
          • 2013-03-09
          • 2012-01-05
          • 2019-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-13
          相关资源
          最近更新 更多