Javaでは、型変数の配列を宣言することはできますが、配列を作成することはできません。それは不可能ですか?タイプ変数の配列をJavaで作成する方法は?
class ClassName<T> {
{
T[] localVar; // OK
localVar = new T[3]; // Error: Cannot create a generic array of T
}
}
Javaでは、型変数の配列を宣言することはできますが、配列を作成することはできません。それは不可能ですか?タイプ変数の配列をJavaで作成する方法は?
class ClassName<T> {
{
T[] localVar; // OK
localVar = new T[3]; // Error: Cannot create a generic array of T
}
}
一般的なタイプの配列は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
これは言語でのみ可能です例えばGosuのような汎用ジェネリック医薬品。 Javaにはタイプ消去があるため、実行時にTのタイプは使用できません。
できません。 、私はこの問題を回避得たもう一つの方法は、型変数を保持するために別のクラスを作成することである
public static <T> T[] createArray(Class<T> clazz, int size) {
T[] array = (T[]) java.lang.reflect.Array.newInstance(clazz, length);
return array;
}
T[] localVar = (T[])(new Vector<T>(3).toArray()); // new T[3];
その後、作成します。あなたは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); }
}
上記のコードでは、実用的なもののために使用することがカントが、そのちょうど考えを示しました。
[よくある質問](http://stackoverflow.com/tags/java/info) – finnw