Java: regresando la subclase en la firma del método superclase

Estoy trabajando en un problema donde hay varias implementaciones deFoo, acompañado de variosFooBuilder's. MientrasFoocomparten varias variables comunes que deben configurarse, también tienen variables distintas que requieren sus respectivosFooBuilder Para implementar alguna funcionalidad específica. Para ser concisos, me gustaría tener laFooBuilderLos setters para usar el método de encadenamiento, como:

public abstract class FooBuilder {
  ...

  public FooBuilder setA(int A) {
    this.A = A;
    return this;
  }

  ...
}

y

public class FooImplBuilder extends FooBuilder{
  ...
  public FooImplBuilder setB(int B) {
    this.B = B;
    return this;
  }
  public FooImplBuilder setC(int C) {
    this.C = C;
    return this;
  }
  ...
}

Y así sucesivamente, con varios diferentes.FooBuilder implementaciones Esto técnicamente hace todo lo que quiero, sin embargo, este enfoque es sensible al orden de las llamadas de métodos cuando se realiza el encadenamiento de métodos. Lo siguiente tiene errores de compilación de método indefinido:

someFoo.setA(a).setB(b)...

Requerir que el desarrollador piense en el orden de las llamadas de método en la cadena. Para evitar esto, me gustaría tener a los setters enFooBuilder de alguna manera devolver la subclase de implementación real. Sin embargo, no estoy seguro de cómo hacer esto. ¿Cuál es el mejor enfoque?

Respuestas a la pregunta(3)

Su respuesta a la pregunta