Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Scala中需要隐式时,参数多态性会中断_Scala_Implicit_Parametric Polymorphism - Fatal编程技术网

当Scala中需要隐式时,参数多态性会中断

当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]) =

我明白了

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


对于实际的参数类型,我将有一个
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))
}