Ich möchte in der Lage seinen this.type zu verwenden, um eine Methode zu definieren, die neuen Instanzen einer unveränderlichen Fall Klasse. Etwas wie folgt aus:Warum kann nicht für neue Instanzen verwendet werden this.type
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)
}
}
Leider ist der Compiler beschwert
test.scala:13: error: type mismatch;
found : Derived
required: Derived.this.type
new Derived(left, right)
^
one error found
Wie kommt der neue Fall Klasse this.type nicht überein?
Wenn ich this.type zu Base in Base.new_with_changes ändert und Abgeleitet in Derived.new_with_changes das funktioniert, aber es scheint, es fehlt auf der Seite dieses Typs.
Edit: Die wahre Absicht der Frage ist, warum nicht eine äquivalente Art in Scala zu deklarieren, dass der Aufrufer der down die downcast durchführen, sehr ähnlich wie this.type, aber für allgemeine Typen. Ich denke nicht, dass es einfach wäre, aber es wäre nett.
Hacky, aber es funktioniert. Wenn wir so etwas in die Sprache bringen könnten, wäre das cool. –