【问题标题】:Scala error while resolving overloaded methods解决重载方法时出现Scala错误
【发布时间】:2015-09-20 12:02:13
【问题描述】:

我在尝试使用 Play `s Json 库对 json 字符串进行反序列化时遇到以下错误。我知道它无法解析为重载的方法,但我不明白为什么?

Error:(45, 50) overloaded method value apply with alternatives:
  [B](f: B => (String, String, com.model.ESource.Value, com.model.Address, java.time.ZonedDateTime, java.time.ZonedDateTime))(implicit fu: play.api.libs.functional.ContravariantFunctor[play.api.libs.json.Reads])play.api.libs.json.Reads[B] <and>
  [B](f: (String, String, com.model.ESource.Value, com.model.Address, java.time.ZonedDateTime, java.time.ZonedDateTime) => B)(implicit fu: play.api.libs.functional.Functor[play.api.libs.json.Reads])play.api.libs.json.Reads[B]
 cannot be applied to (com.model.Event.type)
      (JsPath \ "startTime").read[ZonedDateTime] and
                                                     ^

上述异常是由(我使用 Play 的 JSON 库 - import play.api.libs)引起的:

case class Event(name: String,
                 sourceId: String,
                 sourceType: ESource.ESource,
                 address: Address,
                 startTime: ZonedDateTime,
                 endTime: ZonedDateTime) {
  val id = Array( name, startTime, endTime ).mkString("-")

  def toJsonString(): String = Json.toJson(this)(Event.jsonWrites).toString()

  def fromJsonString(jsonString: String): Event = {
    val jv = Json.parse(jsonString)
    Json.fromJson[Event](jv)(Event.jsonReads).get
  }
}

object Event {
  val jsonWrites: Writes[Event] = (
    (JsPath \ "name").write[String] and
      (JsPath \ "sourceId").write[String] and
      (JsPath \ "sourceType").write[ESource.ESource] and
      (JsPath \ "address").write[Address](Address.jsonWrites) and
      (JsPath \ "startTime").write[ZonedDateTime] and
      (JsPath \ "endTime").write[ZonedDateTime]
    )(unlift(Event.unapply))

  val jsonReads: Reads[Event] = (
    (JsPath \ "name").read[String] and
      (JsPath \ "sourceId").read[String] and
      (JsPath \ "sourceType").read[ESource.ESource] and
      (JsPath \ "address").read[Address](Address.jsonReads) and
      (JsPath \ "startTime").read[ZonedDateTime] and
      (JsPath \ "endTime").read[ZonedDateTime]
    )(Event)
}

我什至不确定语法的实际含义是什么?我看到=&gt; 用于匿名函数,其中右侧是参数,左侧是函数表达式。但我不确定异常中的 B 指的是什么以及如何解释这 2 个方法签名?

【问题讨论】:

  • Event.jsonReads 是如何定义的?您省略了产生错误的代码。

标签: scala overloading play-json


【解决方案1】:

jsonReads 中,(Event) 需要为(Event.apply _)。正在应用读取组合器的函数必须与其签名匹配,在本例中为 Event.apply _

Event 本身指的是伴生对象,其类型为Event.type。因此出现错误消息 sn -p cannot be applied to (com.model.Event.type)

【讨论】:

  • 非常感谢,这个问题!您介意详细说明您提出的第二点吗。我明白了关于伴生对象的观点,但不明白该点的第二半点 reg the err msg.
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
相关资源
最近更新 更多