当Scala中需要隐式时,参数多态性会中断
我明白了 未找到类型T的Json序列化程序。请尝试为此类型实现隐式写入或格式 在当Scala中需要隐式时,参数多态性会中断,scala,implicit,parametric-polymorphism,Scala,Implicit,Parametric Polymorphism,我明白了 未找到类型T的Json序列化程序。请尝试为此类型实现隐式写入或格式 在 对于实际的参数类型,我将有一个Writes,但我认为这不会清除编译错误。在谷歌搜索了一番之后,我觉得我对这个问题的理解可能缺少了一些基本的东西。感谢您的帮助 错误消息不是很清楚。在这种情况下,您不需要为这种类型实现写入,您只需要向编译器证明您有一个: import play.api.libs.json._ trait A[T] { def foo(t: T)(implicit w: Writes[T]) =
对于实际的参数类型,我将有一个
Writes
,但我认为这不会清除编译错误。在谷歌搜索了一番之后,我觉得我对这个问题的理解可能缺少了一些基本的东西。感谢您的帮助 错误消息不是很清楚。在这种情况下,您不需要为这种类型实现写入,您只需要向编译器证明您有一个:
import play.api.libs.json._
trait A[T] {
def foo(t: T)(implicit w: Writes[T]) = bar(Json.toJson(t))
}
这将如预期的那样起作用。trait中还可以有一个隐式def w:Writes[T]
,这需要实例化器提供一个实例,更严格的是,没有实例就不能实例化A
,但是如果有很多这样的方法,语法上会更清晰一些,实际上,您可能希望更早地启动限制,而不是在您已经实例化了A
并尝试在其上调用foo
之后。提供隐式def写入
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))
}
我想应该是Json.toJson
我说得对吗?@pamu是的,谢谢!修改它。抱歉,但这是错误的,在第二个示例中,方法中的T
将在特征上隐藏该特征,这永远不是您想要的,并且可能导致极其混乱的问题。@TravisBrown编辑了答案。感谢您的建议,但这完全改变了OP的A
:)的语义@TravisBrown看起来像是implicit
param。。编辑了答案。谢谢你的建议
import play.api.libs.json._
trait A[T] {
def foo(t: T)(implicit writes: Writes[T]): JsValue = bar(Json.toJson(t))
}