Me gustaría poder usar this.type para definir un método que crea nuevas instancias de una clase de caso inmutable. Algo como esto:¿Por qué no se puede usar this.type para nuevas instancias?
trait Expression
{
def left : Expression
def right : Expression
def new_with_changes(l : Expression, r : Expression) : this.type
}
case class Derived(left : Expression, right : Expression)
{
def new_with_changes(l : Expression, r : Expression) : this.type =
{
new Derived(left, right)
}
}
Por desgracia, el compilador se queja
test.scala:13: error: type mismatch;
found : Derived
required: Derived.this.type
new Derived(left, right)
^
one error found
¿Cómo es que la nueva clase caso no coincide this.type?
Si cambio this.type a Base en Base.new_with_changes y Derived in Derived.new_with_changes que funciona, pero parece que se está perdiendo la elegancia de this.type.
Editar: El verdadero propósito de la pregunta es por qué no tener una manera equivalente en Scala para declarar que el que llama del down realiza el downcast, de la misma forma que este tipo de tipo, pero para tipos generales. No creo que sea fácil, pero sería bueno.
Hacky, pero funciona. Si pudiéramos obtener algo como esto en el lenguaje, eso sería genial. –