मैं आसानी से सामान्य रूप से एक कोडेक इस तरह एक सील मामले वर्ग के परिवार के लिए निकाले जाते हैं कर सकते हैं:एक मोहरबंद मामले वर्ग के परिवार के लिए जादूगरनी कोडेक पाने जहां आधार विशेषता है एक (सील) टाइप सदस्य
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)
}
वहाँ एक रास्ता मैं प्राप्त कर सकते हैं जो मैं चाहता है? यदि नहीं, तो कुछ ऐसा करने के लिए मैं क्या बदल सकता हूं?
यदि आपने ऑक्स पैटर्न के साथ प्रयास किया तो क्या होगा? जैसे 'ऑक्स टाइप करें [ए <: इनपुट] = बेस {टाइप टी = ए}' फिर 'ऑक्स' से बढ़ाएं? साथ ही, क्या आपको वास्तव में एक प्रकार का सदस्य होने की आवश्यकता है? – pyrospade
वास्तव में, ऐसा लगता है कि आपकी केस कक्षाएं 'एस': इनर' की बजाय उनके तर्क के रूप में 'इनर' ले सकती हैं। – pyrospade
मैंने एक उत्तर जोड़ा, लेकिन बाद में इसे और विस्तार और स्पष्टीकरण जोड़ने के साथ-साथ बेहतर कार्यान्वयन के लिए संशोधित किया है। – pyrospade