我不能编译下面的代码,我很好奇我做错了什么。
我定义了一个矛盾的Jsonwriter特征和一个接受隐式编写器的函数:
trait JsonWriter[-A] {
def write(value: A): Json
}
object Json {
def toJson[A](value: A)(implicit writer: JsonWriter[A]): Json =
writer.write(value)
}此外,我还定义了这些编写器的一些实例:
object JsonWriterInstances {
implicit val stringWriter: JsonWriter[String] =
(value: String) => JsString(value)
implicit val doubleWriter: JsonWriter[Double] =
(value: Double) => JsNumber(value)
class OptionWriter[-T](writer: JsonWriter[T]) extends JsonWriter[Option[T]] {
def write(value: Option[T]): Json = {
value match {
case None => JsNull
case Some(x) => writer.write(x)
}
}
}
implicit def optionWriter[T](implicit writer: JsonWriter[T]):
JsonWriter[Option[T]] = new OptionWriter[T](writer)
}现在我已经写了一个测试:
"write double Option" in {
Some(1.0).toJson should be(JsNumber(1.0))
None.toJson should be(JsNull)
}第一个测试Some(1.0)运行良好,第二个测试None抛出:
Error:(40, 12) could not find implicit value for parameter writer: JsonWriter[None.type]
None.toJson should be(JsNull)如果您想尝试这些代码,我在此示例中的JsonType定义如下:
sealed trait Json
final case class JsObject(get: Map[String, Json]) extends Json
final case class JsString(get: String) extends Json
final case class JsNumber(get: Double) extends Json
case object JsNull extends Json发布于 2018-08-09 15:31:51
如果你不说别的,None是一个Option[Nothing],所以OptionWriter[Nothing]需要一个JsonWriter[Nothing]。如果您尝试Json.toJson(Some(1))是相同的,则没有JsonWriter[Int]。
另一方面,Json.toJson(None:Option[String])是有效的,因为OptionWriterString可以获得JsonWriterString。
发布于 2018-08-09 15:20:50
我认为这与以下事实有关
case object None extends Option[Nothing] { ... }如果您执行以下操作之一,它将起作用
toJson(Option.empty[Double])
toJson(None : Option[Double])请注意,第二个代码使用type ascription在Nothing (它是everything的一个子类型)上放置一个face
https://stackoverflow.com/questions/51760206
复制相似问题