J'aimerais pouvoir utiliser this.type pour définir une méthode qui crée de nouvelles instances d'une classe de cas immutable. Quelque chose comme ceci:Pourquoi ce type.type ne peut-il pas être utilisé pour les nouvelles instances?
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)
}
}
Malheureusement, le compilateur se plaint
test.scala:13: error: type mismatch;
found : Derived
required: Derived.this.type
new Derived(left, right)
^
one error found
Comment se fait la nouvelle classe de cas ne correspond pas à this.type?
Si je change this.type à Base dans Base.new_with_changes et Dérivé dans Derived.new_with_changes cela fonctionne, mais il semble qu'il manque sur la finesse de this.type. Edit: Le but réel de la question est pourquoi ne pas avoir un moyen équivalent dans Scala de déclarer que l'appelant de down exécute la descente, un peu de la même manière que this.type, mais pour les types généraux. Je ne pense pas que ce serait facile, mais ce serait bien.
Hacky, mais ça marche. Si nous pouvions obtenir quelque chose comme ça dans la langue, ce serait cool. –