私のコードは次のとおりです。
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
ただし、コンパイラは new T() を受け入れません。パラメータなしで、コンストラクタ MyClass() を使用してこれを行う方法はありますか?
私のコードは次のとおりです。
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
ただし、コンパイラは new T() を受け入れません。パラメータなしで、コンストラクタ MyClass() を使用してこれを行う方法はありますか?
あなたができる
public class MyClass<T extends MyComponent> {
private T t;
MyClass(Class<T> clazz) throws InstantiationException,
IllegalAccessException {
t = clazz.newInstance();
}
}
型消去のため、JVM は何が何でT
あるかを認識できないため、インスタンス化できません。回避策は、 を提供し、Class<T>
それを使用して新しいインスタンスを作成することです。
public MyClass(Class<T> clazz)
{
t = clazz.newInstance();
}
キャッチIllegalAccessException
とを追加する必要がありInstantiationException
ます。
T のクラス オブジェクトにアクセスできないわけではありません。考えてみてください。T は MyComponent の任意のサブクラスである可能性があります。その特定のサブクラスで使用できるコンストラクターをどのように決定しますか?
型消去とは、コンパイラが T へのすべての「実際の」参照を MyComponent に暗黙のうちに置き換えることを意味します。
Class への参照がある場合は、Class#newInstance
を呼び出すか、コンストラクターを取得して呼び出すことができます。