2

多くの「フォーム」クラスがあり、そのすべてが拡張されていFormます。と呼ばれる抽象クラスとFormService、このクラスを拡張する特定のフォーム サービスがあります。私がやりたいのはpopulate()、フォームの型を取る抽象メソッドを呼び出して、継承を通じて特定の型の正しいサービスを呼び出すことです。

だから私は次のようなものを持っています:

public abstract FormService {
    public abstract void populate(Form form);
}

public TestFormService extends FormService {
    public void populate(TestForm form) {
      //populate
    }

whereTestFormは拡張する型ですForm。私が望む効果を得ることができないように見えるので、これは可能ですか?

4

2 に答える 2

9

ジェネリックを使用できます:

public abstract FormService<F extends Form> {
    public abstract void populate(F form);
}

public TestFormService extends FormService<TestForm> {
    @Override
    public void populate(TestForm form) {
      //populate
    }
}

ここでの使用@Overrideは単なる良い習慣ですが、質問とは無関係であることに注意してください。

于 2012-04-12T16:13:34.300 に答える
-1

はい、これは可能です。子クラスのメソッドをオーバーライドする場合と同様に、親クラスのメソッドで引数として宣言されたスーパー クラスのサブクラスを常に使用できます。この例では、testForm は Form クラスのサブクラスであるため、これは機能します。経験則は、オーバーライド中はいつでも階層を制限できますが、階層を広げることはできません。

Form クラスの親クラスが Document であるとします。TestFormService クラスの populate メソッドでは、 Document を引数として使用できません。これはオーバーライド規則に違反します。

于 2016-01-30T11:02:45.877 に答える