【问题标题】:How to create an array of Type Variables, in Java?如何在 Java 中创建类型变量数组?
【发布时间】:2011-01-19 17:57:47
【问题描述】:

在 Java 中可以声明一个类型变量数组,但我无法创建该数组。不可能吗?

class ClassName<T> {
    {
        T[] localVar; // OK
        localVar = new T[3]; // Error: Cannot create a generic array of T
    }
}

【问题讨论】:

标签: java arrays generics


【解决方案1】:

Java 中没有数组的泛型类型。 你可以选择 ArrayList

解释:

java中的数组是协变类型的。

Java 数组具有类型是协变的属性,这意味着超类型引用数组是子类型引用数组的超类型。也就是说,Object[]String[] 的超类型。作为协变的结果,所有类型规则都适用于子类型和超类型:子类型数组可以分配给超类型数组变量,子类型数组可以作为参数传递给期望超类型数组的方法,等等第四。这里是一个例子:

Object[] objArr = new String[10];// fine

相比之下,泛型集合不是协变的。超类型的参数化类型的实例化不被视为子类型的相同参数化类型的实例化的超类型。也就是说,LinkedList&lt;Object&gt; 不是LinkedList&lt;String&gt; 的超类型,因此LinkedList&lt;String&gt; 不能是在需要 LinkedList&lt;Object&gt; 的地方使用;相同参数化类型的这两个实例之间没有赋值兼容性,等等。下面是一个说明差异的示例:

LinkedList<Object> objLst = new LinkedList<String>(); // compile-time error

来源:http://www.angelikalanger.com/Articles/Papers/JavaGenerics/ArraysInJavaGenerics.htm

【讨论】:

    【解决方案2】:
    T[] localVar = (T[])(new Vector<T>(3).toArray()); // new T[3];
    

    【讨论】:

      【解决方案3】:

      这只能在具有具体泛型的语言中实现,例如Gosu。 Java 有类型擦除,所以 T 的类型在运行时不可用。

      【讨论】:

        【解决方案4】:

        你不能。如果您有代表TClass 对象,您可以这样做,您可以使用java.lang.reflect.Array

        public static <T> T[] createArray(Class<T> clazz, int size) {
            T[] array = (T[]) java.lang.reflect.Array.newInstance(clazz, length);
            return array;
        }
        

        【讨论】:

          【解决方案5】:

          我解决此问题的另一种方法是创建一个不同的类来保存类型变量,然后创建该类的数组 例如。

              public class test<T>{
                  data[] localVar = new data[1];
                  private class data<E>{
                      E info;
                      public data(E e){ info = e; }
                  }
                  public void add(T e){ localVar[0] = new data<T>(e); }
              }
          

          除非您想将一项添加到数组中,否则上述代码不能用于任何实际操作,但它只是说明了这个想法。

          【讨论】:

            【解决方案6】:

            您不能直接初始化泛型类型。但是,您可以创建一个 Object 类型的数组并将其转换为通用数组类型,如下所示:

            class ClassName<T> {
                {
                    T[] localVar = (T[]) new Object[3];
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2021-02-04
              • 2011-08-02
              • 2019-09-29
              • 1970-01-01
              • 2014-02-23
              • 2011-07-22
              • 1970-01-01
              相关资源
              最近更新 更多