Я хотел бы иметь возможность использовать this.type для определения метода, который создает новые экземпляры неизменяемого класса case. Что-то вроде этого:
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)
}
}
К сожалению, компилятор жалуется
test.scala:13: error: type mismatch;
found : Derived
required: Derived.this.type
new Derived(left, right)
^
one error found
Почему новый класс case не соответствует this.type?
Если я изменяю this.type на Base в Base.new_with_changes и Производится в Derived.new_with_changes, который работает, но кажется, что он пропускает тонкости this.type.
Изменить: реальное намерение вопроса состоит в том, почему у него нет эквивалентного способа в Scala, чтобы объявить, что вызывающий элемент down выполняет downcast, почти так же, как this.type, но для общих типов. Я не думаю, что это будет легко, но было бы хорошо.