Polymorpher Scala-Rückgabetyp

Ich habe eine abstrakte Scala-KlasseBase das hat UnterklassenDerived1 undDerived2. Base definiert eine Funktion f (), die ein Objekt desselben Typs wie seine implementierende Klasse zurückgibt. SoDerived1.f() kehrt zurückDerived1 undDerived2.f() kehrt zurückDerived2. Wie schreibe ich das in Scala?

Folgendes habe ich mir bisher ausgedacht.

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

Dies führt zu folgenden Compilerfehlern:

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)

Diese Fehlermeldung verwirrt mich, weil ich denkecom.github.wpm.cancan.Derived1 sollte das gleiche sein wieDerived1 in diesem Kontext.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage