Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

抽象クラスのインナークラスのインスタンスを生成する方法

例えば以下のように、
public abstract class Test {
....
    public Test2 extends Test {
        ....
    }
    public Test3 extends Test {
        ....
    }
}
という構成のクラスがあって、Test2やTest3のインスタンスを作りたい時、
Test2 tmp = new Test.Test2(); や
Test3 tmp = 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等を継承する以外の方法で、どうやればインスタンスを取得できるでしょうか?
また、エラーはなぜ出てきてしまうのでしょうか?
教えて下さい。

1

回答

3973

閲覧

1件の回答

評価

0

インスタンスインナークラスは外のクラスのインスタンスが作られて初めてクラス定義がロードされる。
staticはクラスのインスタンスではなくクラス自体の持ち物だから、抽象化もoverrideもできない。

外のクラスを匿名クラスでインスタンス化するか、staticメソッドで引数その他の条件に応じてインナークラスを返し分けるか、インナークラス自体をstaticにすれば良かろう。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。