¿Cómo usar Scala's this typing, abstract types, etc. para implementar un Self type?
No pude encontrar la respuesta a esto en ninguna otra pregunta. Supongamos que tengo una superclase abstracta Abstract0 con dos subclases, Concrete1 y Concrete1. Quiero poder definir en Abstract0 algo como
def setOption(...): Self = {...}
donde Self sería el subtipo concreto. Esto permitiría encadenar llamadas a setOption de esta manera:
val obj = new Concrete1.setOption(...).setOption(...)
y todavía obtener Concrete1 como el tipo inferido de obj.
Lo que no quiero es definir esto:
abstract class Abstract0[T <: Abstract0[T]]
porque hace que sea más difícil para los clientes manejar este tipo. Probé varias posibilidades, incluido un tipo abstracto:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
pero es imposible implementar setOption, porquethis
en Abstract0 no tiene el tipo Self. Y usandothis: Self =>
tampoco funciona en Abstract0.
¿Qué soluciones hay para este problema?