加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何在反序列化Json时修复对重载的apply()方法的不明确

发布时间:2020-12-16 18:38:13 所属栏目:安全 来源:网络整理
导读:给定以下需要对 JSON进行序列化/反序列化的案例类… import play.api.libs.jsonimport play.api.libs.functional.syntax._trait MyTrait(s1: String,s2: String)case class MyClass(s1: String,s2: String) extends MyTrait { def this(t: MyTrait) = this(t
给定以下需要对 JSON进行序列化/反序列化的案例类…

import play.api.libs.json
import play.api.libs.functional.syntax._

trait MyTrait(s1: String,s2: String)

case class MyClass(s1: String,s2: String) extends MyTrait {

  def this(t: MyTrait) = this(t.s1,t.s2)
}

object MyClass {

  def apply(t: MyTrait) = new MyClass(t)

  implicit val myClassJsonWrite = new Writes[MyClass] {
    def writes(c: MyClass): JsValue = {
      Json.obj(
        "s1" -> c.s1,"s2" -> c.s2
      )
    }
  }

  implicit val myClassJsonRead = (
    (__  's1).read[String] ~
    (__  's2).read[String]
  )(MyClass.apply _)
}

…我总是收到以下错误消息:

[error] /home/j3d/Projects/test/app/models/MyClass.scala:52: ambiguous reference to overloaded definition,[error] both method apply in object MyClass of type (s1: String,s2: String)models.MyClass
[error] and  method apply in object MyClass of type (t: MyTrait)models.MyClass
[error] match expected type ?
[error]   )(MyClass.apply _)
[error]             ^

…为什么编译器没有推断出正确的apply方法?我怎么能修复这个错误?任何帮助将非常感激.谢谢.

解决方法

您可以选择正确的方法,如下所示:

MyClass.apply(_: String,_: String)

编译器无法推断出正确的类型,因为您引用了apply方法.因为您明确引用它们,编译器不会为您做出选择.

为了使语法更具可读性,您可以更改伴随对象定义

object MyClass extends ((String,String) => MyClass) {

这样您就可以简单地引用伴随对象而不是模糊的apply方法

implicit val myClassJsonRead = (
  (__  's1).read[String] ~
  (__  's2).read[String])(MyClass)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读