Tipo de retorno de la Scala polimorfa

Tengo una clase abstracta de ScalaBase que tiene subclasesDerived1 yDerived2. Base define una función f () que devuelve un objeto del mismo tipo que su clase de implementación. Asi queDerived1.f() devolucionesDerived1 yDerived2.f() devolucionesDerived2. ¿Cómo escribo esto en Scala?

Esto es lo que he encontrado hasta ahora.

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

Esto da los siguientes errores de compilación:

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)

Este mensaje de error me resulta confuso porque piensocom.github.wpm.cancan.Derived1 debe ser el mismo queDerived1 en este contexto.

Respuestas a la pregunta(2)

Su respuesta a la pregunta