我很容易一般導出的編解碼器爲一個密封的箱體類家庭這樣的:推導瑟茜編解碼器爲一個密封的箱體類家族,其中鹼性狀具有(密封)型構件
import io.circe._
import io.circe.generic.auto._
sealed trait Base
case class X(x: Int) extends Base
case class Y(y: Int) extends Base
object Test extends App {
val encoded = Encoder[Base].apply(Y(1))
val decoded = Decoder[Base].apply(encoded.hcursor)
println(decoded) // Right(Y(1))
}
然而,如果我添加類型成員的基類,我不能這樣做了,即使它是由一個密封的特質界:
import io.circe._
import io.circe.generic.auto._
sealed trait Inner
case class I1(i: Int) extends Inner
case class I2(s: String) extends Inner
sealed trait Base { type T <: Inner }
case class X[S <: Inner](x: S) extends Base { final type T = S }
case class Y[S <: Inner](y: S) extends Base { final type T = S }
object Test extends App {
val encodedInner = Encoder[Inner].apply(I1(1))
val decodedInner = Decoder[Inner].apply(encodedInner.hcursor) // Ok
println(decodedInner) // Right(I1(1))
// Doesn't work: could not find implicit for Encoder[Base] etc
// val encoded = Encoder[Base].apply(Y(I1(1)))
// val decoded = Decoder[Base].apply(encoded.hcursor)
// println(decoded)
}
有沒有一種方法,我可以實現我想要什麼?如果不是,我可以改變什麼來獲得類似的東西?
如果您嘗試使用輔助模式,該怎麼辦?例如'Aux [A <:Input] = Base {type T = A}'然後從'Aux'擴展?另外,你是否真的需要它是一個類型成員? – pyrospade
事實上,似乎你的案例類可能只是將'Inner'作爲它們的參數,而不是'S <:Inner'。 – pyrospade
我添加了一個答案,但後來修改它以添加更多的細節和解釋,以及更好的實現。 – pyrospade