2011-01-19 132 views
4

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

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

添加到[常见问题](http://stackoverflow.com/tags/java/info) – finnw 2011-01-19 19:02:07

回答

5

数组的通用类型在Java中不存在。 你可以去的ArrayList

说明:

阵列中的Java是协变型。

Java数组具有有类型是协变的特性,这意味着超类型引用数组是亚型references.That的阵列的超类型是,Object[]String[]例如一个超类型。作为协变的结果,所有类型规则都适用于子类型和超类型惯例:可以将子类型数组分配给超类型数组变量,可以将子类型数组作为参数传递给期望超类型数组的方法等等,等等forth.Here是一个例子:

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

相反,通用集合不是协变。超类型的参数化类型的实例化不被视为子类型的相同参数化类型的实例化的超类型。即,LinkedList<Object>不是超类型的LinkedList<String>,因此在预期LinkedList<Object>LinkedList<Object>的情况下不能使用LinkedList<String> ;有相同的参数化的类型的这两个实例之间没有分配兼容性,etc.Here是示出了差的例子:

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

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

2

这是唯一可能的与语言泛化的泛型,如Gosu。 Java有类型擦除,所以T的类型在运行时不可用。

1

你不能。如果你有代表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; 
} 
3
T[] localVar = (T[])(new Vector<T>(3).toArray()); // new T[3]; 
0

的另一种方式,我得到的解决办法是通过创建一个不同的类来保存类型变量,然后创建例如,该类的数组。

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

上面的代码不能用于任何实际的东西,除非你想添加一个项目到一个数组,但它只是显示了想法。

相关问题