2

次の抽象クラスがあります。

public abstract class AbstractSharpCollection<T> implements SharpCollection<T>

とインターフェース

public interface SharpCollection<T> extends Iterable<T>
{
    SharpCollection<T> tail();
}

別の SharpCollection を返す SharpCollection には、他にも多くのメソッドが定義されています。これらすべてのメソッドのロジックは、反復子のみに依存しています。

tail() の呼び出しがスーパークラスではなくサブクラスのインスタンスを返すように、AbstractSharpCollection でメソッドを作成できるようにしたいと考えています。

何かのようなもの

public <V extends SharpCollection<T>> V tail() { //code logic here }

AbstractSharpCollection を拡張するサブクラスで戻り値の型をオーバーライドできることはわかっていますが、戻り値の型を変更するためだけにすべてのメソッドをオーバーライドしなければならないのは、非常に見苦しく、面倒で、エラーが発生しやすくなります。

私が望むものを達成できる方法はありますか?

助けてくれてありがとう。

4

1 に答える 1

2

実装tailはかなり難しいでしょう。nullが唯一の有効な戻り値です。

SharpCollection使用されている実際のインターフェースタイプを「認識する」ように、をパラメーター化する必要があるようです。

public interface SharpCollection<
    THIS extends SharpCollection<THIS, T>,
    T
> extends Iterable<T> {
    THIS tail();
}

残念ながら、これはクライアント コードも複雑にします。

于 2012-08-16T15:22:15.113 に答える