在 Scala 中,如何使用不同上下文边界的函数为 类 创建特征
In Scala, how to create a trait for classes with functions using different context bounds
现在想要serialize/deserializeJson数据,有几个json库可以选择。但是,他们对 encoding/decoding 使用不同的上下文边界,这使得很难为他们定义特征。
trait JsonLib {
// def writes[T](data: T): String
// def reads[T](jsonStr: String): Option[T]
}
object JsonCirce extends JsonLib {
import io.circe.Encoder._
import io.circe.Decoder._
def writes[T: Encoder](data: T): String = ...
def reads[T: Decoder](jsonStr: String): Option[T] =
}
//spray-json
object JsonSpray extends JsonLib {
import spray.json._
def writes[T: JsonWriter](data: T): String = ...
def reads[T: JsonReader](jsonStr: String): Option[T] = ...
}
有没有办法在特征中定义writes/reads?
您可以使用更高种类的类型概括类型 类,例如:
import scala.language.higherKinds
import scala.util.Try
import spray.json._
import DefaultJsonProtocol._
trait JsonLib[R[_], W[_]] {
def writes[T: W](data: T): String
def reads[T: R](jsonStr: String): Option[T]
}
//spray-json
object JsonSpray extends JsonLib[JsonReader, JsonWriter] {
override def writes[T: JsonWriter](data: T): String =
data.toJson.compactPrint
override def reads[T: JsonReader](jsonStr: String): Option[T] =
Try(jsonStr.parseJson.convertTo[T]).toOption
}
// Test
JsonSpray.writes(List(1, 2))
JsonSpray.reads[List[Int]]("[1,2]")
现在想要serialize/deserializeJson数据,有几个json库可以选择。但是,他们对 encoding/decoding 使用不同的上下文边界,这使得很难为他们定义特征。
trait JsonLib {
// def writes[T](data: T): String
// def reads[T](jsonStr: String): Option[T]
}
object JsonCirce extends JsonLib {
import io.circe.Encoder._
import io.circe.Decoder._
def writes[T: Encoder](data: T): String = ...
def reads[T: Decoder](jsonStr: String): Option[T] =
}
//spray-json
object JsonSpray extends JsonLib {
import spray.json._
def writes[T: JsonWriter](data: T): String = ...
def reads[T: JsonReader](jsonStr: String): Option[T] = ...
}
有没有办法在特征中定义writes/reads?
您可以使用更高种类的类型概括类型 类,例如:
import scala.language.higherKinds
import scala.util.Try
import spray.json._
import DefaultJsonProtocol._
trait JsonLib[R[_], W[_]] {
def writes[T: W](data: T): String
def reads[T: R](jsonStr: String): Option[T]
}
//spray-json
object JsonSpray extends JsonLib[JsonReader, JsonWriter] {
override def writes[T: JsonWriter](data: T): String =
data.toJson.compactPrint
override def reads[T: JsonReader](jsonStr: String): Option[T] =
Try(jsonStr.parseJson.convertTo[T]).toOption
}
// Test
JsonSpray.writes(List(1, 2))
JsonSpray.reads[List[Int]]("[1,2]")