質問: newOptionInstance(); new CmdLineParser(option).parseArgument(args); } } ``` サブクラス ``` public class HogeRunner extends AbstractCommandLine { // このメソッドの実装を省略したい... @Override protected HogeOption newOptionInstance() { return new HogeOption(); } @Override protected int execute(HogeOption option) { // blah blah } } ``` コマンドが増えるたびに下記の手順で、実装するというアーキテクチャにしたいのですが、 * AbstractCommandLineOptionを継承してコマンド引数を格納するオブジェクトを用意 * AbstractCommandLineRunnerを継承してexecuteメソッドに処理を実装 CmdLineParserライブラリの都合上、オプションのインスタンスが必要なため、newOptionInstance()というabstractメソッドを定義しています。できればこれを排除して親クラスでインスタンスを作りたいのですが、Javaにおいては困難でしょうか。 * 開発言語:Java * 開発環境:Eclipse * フレームワーク:Spring Boot
回答: > > どうしてもnew T()相当を実装したいのですが、回避策はないでしょうか。 > > > Java言語のジェネリクスでは、型パラメータ`T`から直接インスタンス化することができません。(Java言語仕様で禁止されています) アドホックな回避策としては、本家StackOverflow Create instance of generic type in Java? の回答群が参考になると思います。 フレームワーク側でよくある対処としては、`ParameterizedType`を利用したリフレクション(reflection)方式で、サブクラスの型パラメータを取得できます。実際にこの方式が望ましいか否かは状況に応じて判断ください。