質問: new Test().new Test3(); などでは生成できないことは理解しました。 そこで、抽象クラスであるTestにpublic abstract staticな↓のファクトリメソッドを作り、それを継承させればよいのでは、と思いました。 親: public static abstract Class extends Test> createInstance(); 子: @Override public static Test2 createInstance() { return new Test2(); } しかし、このコードだと、親では「型 Test の 抽象メソッド createInstance は public または protected の可視性修飾子のどちらか 1 つのみをセットできます」が、子では「戻りの型は Test.createInstance() と互換性がありません」というエラーが出てしまいます。 インスタンス生成したいクラスでTest2等を継承する以外の方法で、どうやればインスタンスを取得できるでしょうか? また、エラーはなぜ出てきてしまうのでしょうか? 教えて下さい。
回答: インスタンスインナークラスは外のクラスのインスタンスが作られて初めてクラス定義がロードされる。 staticはクラスのインスタンスではなくクラス自体の持ち物だから、抽象化もoverrideもできない。 外のクラスを匿名クラスでインスタンス化するか、staticメソッドで引数その他の条件に応じてインナークラスを返し分けるか、インナークラス自体をstaticにすれば良かろう。