流暢なアプローチを採用すると、次のシナリオが考えられます。
public class Foo<T extends a>{
public Foo<T> someMethod(){
System.out.println("foo");
return this;
}
}
public class Bar<T extends b> extends Foo<T> {
public Bar<T> barMethod(){
System.out.println("bar");
return this;
}
}
public class a{}
public class b extends a{}
流暢なインターフェイスの強みは、メソッド呼び出しを連鎖できることですが、Bar は someMethod() を継承していますが、戻り値の型は Bar ではなく Foo であり、次の連鎖を壊してしまいます:
new Bar<b>().someMethod().barMethod();
1 つの答えは、Bar に追加のメソッドがあるように、継承されたすべてのメソッドに @Overrides を追加することです。
@Override
public Bar<T> someMethod(){
System.out.println("foo");
return this;
}
しかし、大規模なクラスや拡張されたクラス階層では、これは確実に冗長性の混乱を証明する可能性があります?! 流暢なメソッドに与える適切な戻り値の型はありますか?それにより、それを継承するすべてのクラスが特定の型のオブジェクトを返します (キャストなしでメソッドを連鎖できるようにするため)。
私は試した:
public <U extends Foo<T>> U someMethod(){
System.out.println("foo");
return this;
}
残念ながら、役に立ちません。この問題に対するシンプルでエレガントな解決策を誰かが知っていることを願っています。プロジェクトは大規模であるため、可能であれば保守と拡張が可能である必要があります。
このシナリオで提供できるヘルプに感謝します。