Java - Inherited Fluent method retorna o tipo para retornar o tipo de classe de incidente, não o de pais
Quando você emprega uma abordagem fluente, você pode ter o seguinte cenário:
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{}
A força de uma interface fluente é que você pode encadear invocações de método, mas enquanto Bar herdou algum método (), o tipo de retorno é Foo não Bar, que quebraria a seguinte cadeia:
new Bar<b>().someMethod().barMethod();
Uma resposta poderia ser adicionar @Overrides para cada método herdado, de forma que Bar tenha o método adicional:
@Override
public Bar<T> someMethod(){
System.out.println("foo");
return this;
}
Mas em grandes classes e hierarquias de classes estendidas isso pode ser uma bagunça de redundância certamente ?! Existe um tipo de retorno apropriado para dar a fluentes métodos em que cada classe que herda ele retornará um objeto de seu tipo específico (para que possamos encadear métodos sem elencos)?
Eu tentei:
public <U extends Foo<T>> U someMethod(){
System.out.println("foo");
return this;
}
Infelizmente, sem sucesso. Espero que alguém conheça uma solução simples e elegante para esse problema. O projeto é grande e, portanto, precisa ser mantido e extensível, se possível.
Obrigado a qualquer ajuda que você possa fornecer neste cenário.