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.