2

你能帮我写通用隐式转换吗?

我正在使用 Scala 2.10.2 和 Spray 1.2。

这是我所拥有的

// for "parameters"
implicit def ObjectIdUnmarshallerString = new Deserializer[String, ObjectId] {
  def apply(value: String) =
    try Right(new ObjectId(value))
    catch {
      case ex: Throwable => Left(MalformedContent(s"Cannot parse: $value", ex))
    }
}

//  for "formParameters"
implicit def ObjectIdUnmarshallerHttpEntity = new Deserializer[HttpEntity, ObjectId] {
  def apply(value: HttpEntity) = ObjectIdUnmarshallerString(value.asString)
}

如您所见,HttpEntity->ObjectId 的反序列化器仅使用 String->ObjectId 反序列化器。我必须为我在 HTTP 路由特征中使用的每个类复制粘贴这样的代码。

所以我想如果我可以编写通用的 HttpEntity->T ,它将Deserializer[String, T]在范围内使用。

我试过这个:

  implicit def GenericUnmarshallerHttpEntity[T] = new Deserializer[HttpEntity, T] {
    def convertAsString(value: HttpEntity)(implicit conv: Deserializer[String, T]) = conv(value.asString)

    def apply(value: HttpEntity) = convertAsString(value)
  }

可悲的是它不起作用。并说:

could not find implicit value for parameter conv: spray.httpx.unmarshalling.Deserializer[String,T]
    def apply(value: HttpEntity) = convertAsString(value)
                                                  ^

not enough arguments for method convertAsString: (implicit conv: spray.httpx.unmarshalling.Deserializer[String,T])spray.httpx.unmarshalling.Deserialized[T].
Unspecified value parameter conv.
    def apply(value: HttpEntity) = convertAsString(value)
                                                  ^

你能建议怎么做吗?

4

2 回答 2

2

尝试implicit def GenericUnmarshallerHttpEntity[T](implicit conv: Deserializer[String, T]) = ...并从中删除隐式参数convertAsString

正如它在问题中所代表的那样,apply隐式不需要在范围内,因此它不能调用该convertAsString方法。

于 2013-08-06T02:30:25.687 回答
0

您的 apply 函数需要将隐式传递给 convert 方法

implicit def GenericUnmarshallerHttpEntity[T] = new Deserializer[HttpEntity, T] {
  def convertAsString(value: HttpEntity)(implicit conv: Deserializer[String, T]) = conv(value.asString)

  def apply(value: HttpEntity)(implicit conv: Deserializer[String, T]) = convertAsString(value)
}
于 2013-08-06T01:50:22.343 回答