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)
}
}
残念ながら、コンパイラは文句を言います
test.scala:13: error: type mismatch;
found : Derived
required: Derived.this.type
new Derived(left, right)
^
one error found
新しいケース クラスが this.type と一致しないのはなぜですか?
this.type を Base.new_with_changes で Base に変更し、Derived.new_with_changes で Derived に変更すると動作しますが、this.type の優れた点を見逃しているようです。
編集:質問の本当の意図は、ダウンの呼び出し元がダウンキャストを実行することを宣言する同等の方法をScalaに持たない理由です。これは、this.typeとほぼ同じ方法ですが、一般的なタイプの場合です。簡単にはいかないと思いますが、いいと思います。