私は次のような状況で型の安全性を達成したいと思います。Scala:型推論がありません
基本的には、データベースに格納されているさまざまなタイプのリクエストがあり、そのタイプは文字列コードで識別されます。ビジネス上の理由から、このコードではではなく、がクラス名と一致します。
要求の各タイプにはある種のペイロードが含まれ、ペイロードのタイプは要求のタイプに直接依存します。
trait Request[Payload] {
def metadata: String // Not relevant
def payload: Payload
}
case class RequestWithString(override val metadata: String, override val payload: String) extends Request[String]
case class AnotherTypeOfRequestWithString(override val metadata: String, override val payload: String) extends Request[String]
case class RequestWithInt(override val metadata: String, override val payload: Int) extends Request[Int]
object Request {
def apply(code: String)(metadata: String, payload: Any): Request[_] = code match {
case "S" => RequestWithString(metadata, payload.asInstanceOf[String])
case "S2" => AnotherTypeOfRequestWithString(metadata, payload.asInstanceOf[String])
case "I" => RequestWithInt(metadata, payload.asInstanceOf[Int])
}
}
をこれは私がScalaはキャストを避けるためにペイロードの型を推論したい、と(parametered)タイプとして満足ではありません。ここで
は、私がこれまで達成してきたものの簡易版であります戻り値の私が探しています何
はそのようなものです:
object Request {
def apply[P, R <: Request[P]](code: String)(metadata: String, payload: P): R = code match {
case "S" => RequestWithString(metadata, payload)
case "S2" => AnotherTypeOfRequestWithString(metadata, payload)
case "I" => RequestWithInt(metadata, payload)
}
}
しかし、これは、私はいくつかの種類の不一致エラーを取り除くことはできません動作していないよう:
found : P
required: String
case "S" => RequestWithString(metadata, payload)
^
Shouldn」この場合、PはStringであるとScalaは推測していますか?私は何が欠けていますか?
? –
@YuvalItzchakov:ReactiveMongoを使用したMongoDBストレージ。ペイロードとリモートデータから人間が読めるテキストを作成し、テキストをリモートシステムに送信します。 MongoDBを読み書きする必要がありますが、Request.apply関数の主な目的はBSONReader [Request]で呼び出されることです。 –
現在の回答が多くを助けています。しかし、Requestのタイプがペイロードのタイプに依存するだけではないことを明確にするために編集しました。同じ種類のペイロードを持つ複数のリクエストサブクラスが存在する可能性があります。 –