当Scala中存在隐式时,参数多态性会中断

时间:2016-10-14 17:36:38

标签: scala implicit parametric-polymorphism

我得到了

  

找不到类型T的Json序列化程序。尝试为此类型实现隐式写入或格式。

import play.api.libs.json._

trait A[T] {
  def foo(t: T) = bar(Json.toJson(t))
}

对于实际的参数类型,我将有一个Writes,但我没有看到这会清除编译错误。经过一些谷歌搜索,我觉得我对这个主题的理解可能会有一些基本的缺失。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

在这种情况下,错误信息不是很清楚 - 您不需要为此类型实现Writes,您只需要向编译器证明您有一个:< / p>

import play.api.libs.json._

trait A[T] {
  def foo(t: T)(implicit w: Writes[T]) = bar(Json.toJson(t))
}

这将按预期工作。你也可能在特征中有一个implicit def w: Writes[T],这需要实例化器提供一个实例,这更具限制性,因为你可以在没有实例的情况下实例化A,但它实际上是&#39}如果你有很多像这样的方法,那么在语法上会更清洁一点,你可能真的希望限制能够提前开始,而不是在你已经实例A并且你已经实例化之后。重新尝试拨打foo

答案 1 :(得分:0)

提供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))
}