5

次のようなものがある場合:

class Test<T extends X> {
    public T test() {
        T t = /* ... */;
        return t;
    }
}

Tのクラスをインスタンス化できるようにキャプチャするにはどうすればよいですか? タイプの消去を防ぐための回避策はありますか? Tのメソッドにアクセスする必要さえありません。 は問題なく動作しますがX、 を返す必要がありTます。

4

3 に答える 3

4

できる唯一のことは、 T のクラスを追加の引数として渡すか、test()class のメンバー フィールドを設定することTestです。型の消去を防ぐことはできません。

class Test<T extends X> {
    private Class<T> mClass;
    public Test(Class<T> c) {
        mClass = c;
    }
    public T test() {
        T t = mClass.newInstance();
        return t;
    }
}

または、ファクトリ オブジェクトを同じ効果に渡すことができます。これは、デフォルトのコンストラクター以外のものを使用する必要がある場合にうまく機能します。

于 2012-10-07T05:49:20.347 に答える
3

次のように定義します。

class Test<T extends X>
{
    public T test(Class<T> c)
    {
        T t = c.newInstance();
        return t;
    }
}

次のように使用します。

Test<Foo> t = new Test<Foo>();
t.test(Foo.class);
于 2012-10-07T05:49:09.943 に答える
0

直接行うことはできませんが、T が実装するインターフェイスを追加して、インスタンスまたは T の配列を作成できます。

于 2012-10-07T05:49:09.870 に答える