いいえ、できません。コード内でを参照することさえできませんList<String>.class
。コンパイル エラーが発生します。には 1 つのクラス オブジェクトしかなくList
、それは と呼ばれList.class
ます。
実行時の型消去のためにこれは不可能ですか?
正しい。
ところで、これは注釈付きの型ではなく、ジェネリック型です。
アップデート
よく考えてみると、Josh Bloch のタイプセーフな異種コンテナー( Effective Java 2nd Ed.、Item 29で公開) を少し調整することで、上記の Map にかなり近いものを作成できます。
public class Lists {
private Map<Class<?>, List<?>> lists =
new HashMap<Class<?>, List<?>>();
public <T> void putList(Class<T> type, List<T> list) {
if (type == null)
throw new NullPointerException("Type is null");
lists.put(type, list);
}
public <T> List<T> getList(Class<T> type) {
return (List<T>)lists.get(type);
}
}
キャストインgetList
はチェックされず、警告が表示されますが、残念ながらそれを回避することはできません。ただし、コンパイラによって保証されているため、 class に格納される値は でX
なければならないことがわかっています。List<X>
したがって、キャストは安全だと思います(ルールに従ってプレイする場合、つまりputList
、プレーンな非ジェネリックClass
パラメーターで呼び出すことはありません)。したがって、を使用して抑制できます@SuppressWarnings("unchecked")
。
そして、次のように使用できます。
Lists lists = new Lists();
List<Integer> integerList = new ArrayList<Integer>();
List<String> stringList = new ArrayList<String>();
...
lists.putList(Integer.class, integerList);
lists.putList(String.class, stringList);
List<Integer> storedList = lists.getList(Integer.class);
assertTrue(storedList == integerList);