Tipo de retorno polimorfo de Scala

Eu tenho uma classe Scala abstrataBase que tem subclassesDerived1 eDerived2. Base define uma função f () que retorna um objeto do mesmo tipo que sua classe de implementação. assimDerived1.f() devolveDerived1 eDerived2.f() devolveDerived2. Como escrevo isso no Scala?

Aqui está o que eu tenho feito até agora.

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)
}

Isso fornece os seguintes erros do compilador:

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)

Esta mensagem de erro é confusa para mim porque eu achocom.github.wpm.cancan.Derived1 deve ser o mesmo queDerived1 neste contexto.

questionAnswers(2)

yourAnswerToTheQuestion