-1

私のコードは次のとおりです。

public class MyClass<T extends MyComponent> {
    private T t;
    public MyClass(){
        t = new T();
    }
}

ただし、コンパイラは new T() を受け入れません。パラメータなしで、コンストラクタ MyClass() を使用してこれを行う方法はありますか?

4

3 に答える 3

3

あなたができる

public class MyClass<T extends MyComponent> {
    private T t;

    MyClass(Class<T> clazz) throws InstantiationException,
            IllegalAccessException {
        t = clazz.newInstance();
    }

}
于 2013-09-26T21:40:53.243 に答える
1

型消去のため、JVM は何が何でTあるかを認識できないため、インスタンス化できません。回避策は、 を提供し、Class<T>それを使用して新しいインスタンスを作成することです。

public MyClass(Class<T> clazz)
{
    t = clazz.newInstance();
}

キャッチIllegalAccessExceptionとを追加する必要がありInstantiationExceptionます。

于 2013-09-26T21:40:46.770 に答える
1

T のクラス オブジェクトにアクセスできないわけではありません。考えてみてください。T は MyComponent の任意のサブクラスである可能性があります。その特定のサブクラスで使用できるコンストラクターをどのように決定しますか?

型消去とは、コンパイラが T へのすべての「実際の」参照を MyComponent に暗黙のうちに置き換えることを意味します。

Class への参照がある場合は、Class#newInstanceを呼び出すか、コンストラクターを取得して呼び出すことができます。

于 2013-09-26T21:42:27.667 に答える