我正在开发一个网络应用程序,我有一堆模型。
每个模型都扩展并实现以下抽象类:
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"
答案 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邮件列表的遥远历史)