クラスが表現型を持つ特定の特性でパラメーター化されている場合にのみ、インスタンスのコピーを返す必要がある型パラメーターとメソッドを持つクラスがあるとします。私はそれをかなり簡単に実現できます。私ができないことは、そのメソッドの適切な戻り値の型を置くことです:
case class Foo[+A](a: A) {
// Compiles
def gotFooBar(implicit evidence: A <:< Bar[_]) = copy(a = a.Copy())
// Does not compile
def gotFooBar(implicit evidence: A <:< Bar[_]): Foo[A] = copy(a = a.Copy())
}
trait Bar[+B <: Bar[B]] {
def Copy(): B // Return underlying type
}
case class Grill() extends Bar[Grill] {
def Copy() = Grill()
}
その関数の戻り値の型は何ですか? または、おそらくもっと重要なことですが、それが戻り値の型になるようにどのように型を設定すればよいでしょうか? 誰かが実際の戻り値の型が のスーパータイプになる方法を指摘できますFoo[A]
か?