おそらく、説明するのは少し難しいです。しかし、私はそれを試してみます;)
流暢なスタイルに従って、クラスのメソッドがクラス インスタンス自体 (this) を返すのが一般的です。
public class A {
public A doSomething() {
// do something here
return this;
}
}
このような流暢なスタイル クラスを拡張する場合、最初の継承ステップでジェネリック型を介してこれを簡単に行うことができ、スーパー クラスで戻り値の型をこのジェネリック型にキャストできます。
public class A<T extends A<T>> {
public T doSomething() {
// do something here
return (T) this;
}
}
public class B extends A<B> {
// an extended class of class A
}
しかし、この拡張クラスで別の継承ステップを実行するとき、(上位クラスの) メソッドの一般的な戻り値の型とクラスの説明自体 (スーパースーパークラスのメソッドなど) を定義しようとすると、問題が発生します。 class は拡張クラスの型ではなく、スーパークラスの型を返します。ただし、私の意図は、これらの流暢なスタイル メソッドが常に現在のクラスの型を返す必要があることです (上位クラスではありません)。
では、ジェネリックを利用してソリューションを定義することは可能ですか?
PS:簡単な回避策は、拡張クラスでこれらすべてのメソッドをオーバーライドし、それらを現在の型にキャストすることです。ただし、よりエレガントなソリューションに興味があります;)