在Scala中,当期望使用隐式时,参数多态性就会中断



我得到

没有找到t类型的Json序列化器。尝试为该类型实现隐式的write或Format。

import play.api.libs.json._
trait A[T] {
  def foo(t: T) = bar(Json.toJson(t))
}

我将为实际参数类型设置一个Writes,但我不认为这会消除编译错误。在谷歌上搜索了一下之后,我觉得我对这个主题的理解可能缺少了一些基本的东西。任何帮助都是感激的。

在这种情况下,错误信息不是很清楚——你不需要为这种类型实现Writes,你只需要向编译器证明你有一个:

import play.api.libs.json._
trait A[T] {
  def foo(t: T)(implicit w: Writes[T]) = bar(Json.toJson(t))
}

这将按预期工作。你也可以在trait中有一个implicit def w: Writes[T],这将需要实例化器提供一个实例,这是更严格的,因为你不能在没有实例的情况下实例化A,但是如果你有很多这样的方法,它在语法上更清晰,你可能实际上想要更早地启动限制,而不是在你已经实例化了A并且你试图调用foo之后。

提供implicit def writes

import play.api.libs.json._
trait A[T] {
  implicit def writes: Writes[T]
  def foo(t: T) = bar(Json.toJson(t))
}

或将implicit参数写入foo

import play.api.libs.json._
trait A[T] {
  def foo(t: T)(implicit writes: Writes[T]): JsValue = bar(Json.toJson(t))
}

最新更新