用self的返回类型实现抽象方法

时间:2016-06-07 17:13:09

标签: scala generics

我正在开发一个网络应用程序,我有一堆模型。

每个模型都扩展并实现以下抽象类:

case class User(id: String, name: String, dateCreated: String, dateUpdated: String) extends BaseModel {
    ...
}

object User extends BaseModelCompanion[User] {
    implicit val reads = Reads[User] = (...)
    implicit val writes = new Writes[User] { ... }
}

示例:

update

现在我想在我的BaseModel中添加一个名为case class User(id: String, dateCreated: String, dateUpdated: String) extends BaseModel { // Every model needs one of these def update(jsValue: JsValue): User = { copy( name = (jsValue \ "name").as[String].get, ... ) } } 的抽象方法,其中每个模型将接收一些Json并返回自身的克隆。这就是实现的样子:

abstract class BaseModel {
    val dateCreated: String
    val dateUpdated: String

    def update(jsValue: JsValue): ______  // How do I say return an object of type "self"
}

我的问题是我在努力定义抽象方法签名:

"cell10"

1 个答案:

答案 0 :(得分:1)

您可以使用F-bounded多态

abstract class BaseModel[A <: BaseModel[A]] {
    val dateCreated: String
    val dateUpdated: String

    def update(jsValue: String): A
}

case class User(id: String, dateCreated: String, dateUpdated: String) extends BaseModel[User] {
    def update(jsValue: String): User = {
        copy(id = jsValue)
    }
}

oxbow_lakes编辑

您希望使用的功能名为 mytype ,过去曾建议将scalac作为其他语言功能( @extempore )。由于一些不起眼的角落案件,当时它被拒绝了。 (查看scala邮件列表的遥远历史)