2011-01-19 144 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); } 
    } 

上面的代碼不能用於任何實際的東西,除非你想添加一個項目到一個數組,但它只是顯示了想法。

相關問題