次のようなものがある場合:
class Test<T extends X> {
public T test() {
T t = /* ... */;
return t;
}
}
T
のクラスをインスタンス化できるようにキャプチャするにはどうすればよいですか? タイプの消去を防ぐための回避策はありますか? T
のメソッドにアクセスする必要さえありません。 は問題なく動作しますがX
、 を返す必要がありT
ます。
次のようなものがある場合:
class Test<T extends X> {
public T test() {
T t = /* ... */;
return t;
}
}
T
のクラスをインスタンス化できるようにキャプチャするにはどうすればよいですか? タイプの消去を防ぐための回避策はありますか? T
のメソッドにアクセスする必要さえありません。 は問題なく動作しますがX
、 を返す必要がありT
ます。
できる唯一のことは、 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;
}
}
または、ファクトリ オブジェクトを同じ効果に渡すことができます。これは、デフォルトのコンストラクター以外のものを使用する必要がある場合にうまく機能します。
次のように定義します。
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);
直接行うことはできませんが、T が実装するインターフェイスを追加して、インスタンスまたは T の配列を作成できます。