2011-01-19 7 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

答えて

5

一般的なタイプの配列はJavaにはありません。あなたはArrayListの

のために行くことができ 説明:Javaで

配列は共変タイプのものです。

Java配列は、スーパータイプの参照の配列はObject[]は、例えばString[]のスーパータイプであるreferences.Thatサブタイプの配列のスーパータイプであることを意味し、型が共変あるという特性を有しています。共分散の結果として、サブタイプとスーパータイプではすべてのタイプ規則が適用されます。サブタイプ配列はスーパータイプ配列変数に割り当てられ、サブタイプ配列はスーパータイプ配列を予期するメソッドへの引数として渡されます。 forth.Hereは例です。これとは対照的に

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

、ジェネリックコレクションは共変ではありません。スーパータイプのパラメータ化タイプのインスタンス化は、サブタイプの同じパラメータ化タイプのインスタンス化のスーパータイプとはみなされません。LinkedList<Object>はスーパータイプLinkedList<String>ではないため、LinkedList<String>は使用できません。LinkedList<Object>が必要な場合;同じパラメータ化された型のこれら二つのインスタンス間に代入互換性がない、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

できません。 、私はこの問題を回避得たもう一つの方法は、型変数を保持するために別のクラスを作成することである

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

その後、作成します。あなたはTを表すClassオブジェクトを持っている場合、あなたはjava.lang.reflect.Arrayを使用することができ、それを行うことができますそのクラスの配列 。あなたは配列に1つの項目を追加する場合を除き、

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

上記のコードでは、実用的なもののために使用することがカントが、そのちょうど考えを示しました。

関連する問題