私はScalaに不慣れで、暗黙の変換と有名なケーキパターンの可能性を探っています。実装の詳細が漏れないように、抽象型としてリストされたid値を持つモデルクラスを作成しようとしました。また、ケーキパターンの特性ラッパーに混ぜました。idからJSONへの暗黙の変換(Playフレームワーク内)を除いて、すべてが正常に機能します。Scalaコンパイラーは、私が何をしても暗黙の変換を見つけることができません。
問題を再現するコードは次のとおりです。
import anorm._
import play.api.libs.json._
trait Card {
type Key
val NoId: Key
val id: Key
val name: String
}
trait CardModelComponent {
val cardModel: CardModel
trait CardModel {
def findById(id: Long): Option[Card]
def findAll: Seq[Card]
def delete(id: Long)
def create(name: String): Option[Card]
}
}
trait CardModelComponentImpl extends CardModelComponent {
case class CardImpl(id: Pk[Long], name: String) extends Card {
type Key = Pk[Long]
object Key extends Writes[Key] {
implicit def writes(key: Key): JsValue = {
key match {
case Id(idVal: Long) => JsNumber(idVal)
case _ => JsNull
}
}
}
val NoId = NotAssigned
}
class CardModelImpl extends CardModel {
def findById(id: Long): Option[Card] = { None }
def findAll: Seq[Card] = { Seq(CardImpl(Id(1), "Some card"))}
def delete(id: Long) {}
def create(name: String): Option[Card] = { Some(CardImpl(Id(1), name)) }
}
}
object ComponentsRegistry extends
CardModelComponentImpl {
val cardModel = new CardModelImpl
}
val card = ComponentsRegistry.cardModel.create("Test card").get
Json.toJson(card.id)
私が得ているエラー出力は次のようなものです:
> card: Card = CardImpl(1,Test card)
> <console>:19: error: No Json deserializer found for type card.Key. Try to implem
ent an implicit Writes or Format for this type.
Json.toJson(card.id)
^
それを機能させる方法はありますか?ケーキパターンのラッピングは、型名から推測できるように、コンパイラからあまりにも多くの型情報を隠しているように見えcard.Key
ます。
また、PkのWriter実装を直接作成しようとしましたが、結果と同じエラーが発生しました。