Base
サブクラスDerived1
とを持つ抽象 Scala クラスがありDerived2
ます。Base
実装クラスと同じ型のオブジェクトを返す関数 f() を定義します。だからDerived1.f()
戻りますDerived1
とDerived2.f()
戻りますDerived2
。これをScalaで書くにはどうすればよいですか?
これが私がこれまでに思いついたものです。
package com.github.wpm.cancan
abstract class Base {
def f[C <: Base]: C
}
case class Derived1(x: Int) extends Base {
def f[Derived1] = Derived1(x + 1)
}
case class Derived2(x: Int) extends Base {
def f[Derived2] = Derived2(x + 2)
}
これにより、次のコンパイラ エラーが発生します。
type mismatch;
[error] found : com.github.wpm.cancan.Derived1
[error] required: Derived1
[error] def f[Derived1] = Derived1(x + 1)
type mismatch;
[error] found : com.github.wpm.cancan.Derived2
[error] required: Derived2
[error] def f[Derived2] = Derived2(x + 2)
このエラー メッセージは、このコンテキストcom.github.wpm.cancan.Derived1
と同じである必要があるため、混乱を招きます。Derived1