Como usar a digitação do Scala, tipos abstratos etc. para implementar um tipo Self?
Não consegui encontrar a resposta para isso em nenhuma outra pergunta. Suponha que eu tenha uma superclasse abstrata Abstract0 com duas subclasses, Concrete1 e Concrete1. Eu quero ser capaz de definir no Abstract0 algo como
def setOption(...): Self = {...}
onde Self seria o subtipo concreto. Isso permitiria encadear chamadas para setOption assim:
val obj = new Concrete1.setOption(...).setOption(...)
e ainda obter Concrete1 como o tipo inferido de obj.
O que eu não quero é definir isso:
abstract class Abstract0[T <: Abstract0[T]]
porque torna mais difícil para os clientes lidar com esse tipo. Eu tentei várias possibilidades, incluindo um tipo abstrato:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
mas é impossível implementar setOption, porquethis
em Abstract0 não tem o tipo Self. E usandothis: Self =>
também não funciona no Abstract0.
Que soluções existem para esse problema?