- ベストアンサー
型が未決定な状態でのインスタンス化
ジェネリックプログラミングで <T extends > クラス宣言 xxx としたときに、 DIコンテナからロードしたクラスを、 メンバー変数 T にインスタンス化したいです。 しかし、 T test = new T() と 書くことはできず、困っています。 実装する方法をご存じの方がいらっしゃいましたら教えて頂けませんでしょうか? ****************** create メソッドを実装しておくとか、newinstance メソッドを使うとかなのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ジェネリクスで T test = new T(); のように書くことは出来ません。 これは、コンストラクターの引数は実行時まで分からない為と言えます。 コンストラクターを持たないクラスも存在しますからね。(例えば、File file=new File();とは書けません。) また、コンストラクターは継承されないので、extendsで型を限定していてもこれは同じです。 解決方法は、質問文に書かれているように専用のメソッドを用意しておくか、リフレクションを使います。 リフレクションをどの程度ご存知か分からないのですが、一応軽くだけ説明しておきます。(私はあまり使わないので…) 引数無しのコンストラクターはClassクラスのnewInstance()メソッド、引数有りの場合はgetConstructor()メソッドで取得出来るConstructorクラスのインスタンスのnewInstance()メソッドを使います。 例えば、clazzをClassクラスのインスタンスとして、 T test1=clazz.newInstance(); T test2=clazz.getConstructor(String.class).newInstance("文字列"); のように書けるはずです。
その他の回答 (1)
- HNEX
- ベストアンサー率62% (43/69)
Class<T>のインスンタンスがあるならば Class<T> cls; T t = cls.newInstance(); として生成するか、getConstructorを使って任意のコンストラクタを取得して実行すると良いと思います。
お礼
ありがとうございます。 【案1】 Class<T> として変数宣言しつつ、 newInstance とするか、 【案2】 ファクトリークラスから? getConstructor をコールする?でやってみます。 .
お礼
なるほどです。 コンストラクタで引数が必須であるケースがある以上、 new T() は無理ですね。。 【案1】 T test1=clazz.newInstance(); 【案2】 T test2=clazz.getConstructor(String.class).newInstance("文字列"); でやってみます! .