我想在以下情況下實現某種類型的安全。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])
}
}
這不是令人滿意的,因爲我想斯卡拉推斷有效負載的類型,以避免鑄造,以及(參數化)類型的返回值。
我所尋找的是類似的東西:
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)
^
不該」在這種情況下,Scala推斷P是String嗎?我錯過了什麼?
你在每個類型的請求做什麼進一步的處理? –
@YuvalItzchakov:帶有ReactiveMongo的MongoDB存儲,然後從有效負載和遠程數據中編寫人類可讀的文本,以便將文本發送到遠程系統。 我需要讀取/寫入MongoDB,Request.apply函數的主要目的是在BSONReader [Request]中調用。 –
現在的答案幫了很大忙。但是,我編輯了一下,使其更清楚,請求的類型不僅取決於有效負載的類型。可能有幾個具有相同類型Payload的Request子類。 –