0

私はインターフェースを持っていますHTTPSequence。また、抽象クラスAbstractHTTPFactoryがあり、抽象メソッドが。を返しArrayList<HTTPSequence>ます。から派生したクラスでは、AbstractHTTPFactoryこれらのメソッドをオーバーライドしてを返しArrayList<[Class implementing HTTPSequence]>ます。

出来ますか ?これで、コンパイラは、オーバーライドされたメソッドのシグネチャをに変更することを提案するエラーを出しますHTTPSequence

// abstract class with abstract method returning ArrayList of objects implementing interface
abstract public class AbstractHTTPFactory {
    abstract ArrayList<HTTPSequence> make();
}
// Specific class that returns ArrayList of objects of the class implementing HTTPSequence
public class RecipesHTTPFactory extends AbstractHTTPFactory{
    public ArrayList<Recipe> make() {
    }
}
// interface
public interface HTTPSequence {
}
// one of the classes implementing the above interface
public class Recipe implements HTTPSequence {
}

そして、Eclipseが私に与えるメッセージは次のとおりです。

この行の複数のマーカー-戻り値のタイプはAbstractHTTPFactory.make()と互換性がありません-....ider.AbstractHTTPFactory.makeを実装します

4

2 に答える 2

6

AbstractClassメソッドを記述して、を返すことができます。ArrayList<? extends Interface>そうすれば、派生クラスのメソッドシグネチャを変更する必要はありません。

于 2012-04-12T11:02:05.187 に答える
0

次の設計により、呼び出し元に限定的に使用されるワイルドカードのジェネリック型を返す必要がなくなります。

abstract public class AbstractHTTPFactory<T extends HTTPSequence> {
    abstract ArrayList<T> make();
}

public class RecipesHTTPFactory extends AbstractHTTPFactory<Recipe> {
    public ArrayList<Recipe> make() { ... }
}

これで、の代わりに電話new RecipesHTTPFactory().make()をかけて戻ってくることができます。ArrayList<Recipe>ArrayList<? extends HTTPSequence>

ArrayListまた、呼び出し元が特にを期待しない限り、を返す方がよいことに注意してください。make()List<T>

于 2012-04-12T13:11:03.343 に答える