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.