さて、質問はそれをすべて言います。Heresは私が欲しいものの例です
String s = new String();
List<s.type> ls = new ArrayList<s.type>();
そのようなもの、またはこれを達成するためのエレガントな方法は、複数の if 条件または条件ロジックを使用しないでください。無制限のデータ型が存在する可能性があるため、ここでは例としてのみ文字列を使用しました。何でもかまいません。
s の実行時型を取得してジェネリックで使用したい場合、これは不可能です。Java のジェネリックは、型チェックと型推論のためにコンパイル時にのみ使用されます。ジェネリックの情報はランタイムで消去されるため、ランタイムは と の違いを認識できませList<String>
んList<Integer>
。
s のコンパイル時に既知の型でジェネリックを作成したいだけの場合は、s の型が既にわかっていて、そのクラス名を記述できるため、意味がありません。
私があなたを正しく理解していれば、Petr が説明したように、ジェネリックとは何の関係もない実行時 ( existing )のインスタンス ( object ) のクラス ( type ) を知りたいでしょう。
public class Types {
public static void main(String[] args) {
String s = "";
Runtime r = Runtime.getRuntime();
Types t = new Types();
List<Class> types = new LinkedList<Class>();
types.add(Integer.class);
types.add(t.getClass());
types.add(r.getClass());
types.add(s.getClass());
for (Class type :types) {
System.out.println(type.getSimpleName());
}
}
}
出力:
Integer
Types
Runtime
String
ただし、そのようなアプローチが必要になることはめったにないため、問題に対するより簡単な解決策があるかどうかを再考してください。それでもこのように取り組みたい場合:
編集:
あなたの質問の他の解釈は、答えとして動的な一般的なリストにつながります:
public static <T> List<T> createListOfType() {
return new ArrayList<T>();
}
public static void main(String[] args) {
List<String> a = createListOfType();
List<Integer> b = createListOfType();
a.add("");
b.add(2);
a.add(2); // remove this line to compile
b.add(""); // remove this line to compile
}