2012-02-22 9 views
2

私はこのクラスを持っている:もちろんnew T()ジェネリック型の新しいオブジェクトを作成するにはどうすればよいですか?

public class A<T> { 
    protected T something = new T(); 
    ... 
} 

することはできません。代わりに私は何をすることができますか?

このクラスのコンストラクターが呼び出されるコードは、リフレクションによって行われるため、変更しないでください。

その他の問題は、ジェネリッククラスのClassオブジェクトを取得する方法です。 MyMethodは(A.class)が働いていたが、今Aは、パラメータT.

+0

これは非常にオープンになっています。あなたが達成しようとしていることについてより多くの情報を提供できますか? – AndrewC

+0

明示的にクラスをAのコンストラクタに渡すことなく、実行時にAに渡される型パラメータを決定することは可能です。しかし、他の人が尋ねたように、あなたが本当に必要でないときに、なぜそれをしたいのですか? –

+0

(一般的なパラメータ名の慣習に実際に合致するクラス名を使用するのは混乱します。 –

答えて

9

本当に新しいTのインスタンスを作成するには、引数としてTの工場を取る:それは公共の引数なしのコンストラクタを呼び出すnewInstance()方法を、持っているので、

protected T something; 

public A(Factory<T> somethingFactory) { 
    this.something = somethingFactory.newInstance(); 
} 

Class<T>は、Factory<T>とみなすことができます。しかし、Factory<T>は、このコンストラクタ以外のものを使用して新しいインスタンスを作成する可能性があります。

+0

+1工場のソリューションは素晴らしいですが、 'class DongleFactory extends Factory 'のようなものを使う必要があります。 'newInstance'メソッドの中で' new Dongle() 'を呼び出すことができます。さもなければ、あなたは工場で同じ正確な問題に終わることはありません。 –

7

あなたはClass<T>パラメータを取るコンストラクタ(またはメソッド)を持っていて、オブジェクトをインスタンス化するたびに、あなたがタイプを知っているclazz.newInstance()

を持つことができますを持っています、あなたが持っているので、:Aの目標がある場合

protected T something; 

public A(T something) { 
    this.something = something; 
} 

または、:あなたは、コンストラクタのパラメータとしてTを受け取ることができ

A<Foo> a = new A<Foo>(Foo.class); 
+0

私のクラスのコンストラクタが呼び出されるコードを変更してはいけません。 – yoooshi

+1

then - no way .. – Bozho

+0

1.これはあなたの質問の一部として明記しておきます。 2.変更できないクラスにこのような状況が存在するのはなぜですか?または、これの部分だけを変更できますか?私は理解していない - この宿題ですか? –

0

もありません。Tには引数なしのコンストラクタがあること、または抽象的でないことを指定する方法はありません。

抽象的なファクトリまたはプロトタイプを渡すことができます。

反射を使用しないでください!

関連する問題