【问题标题】:play json writes subclass gives ambiguous implicit values error播放 json 写入子类给出模棱两可的隐含值​​错误
【发布时间】:2014-01-28 19:48:16
【问题描述】:

我正在使用播放框架,并且有一个抽象类:

 abstract class Base{...}

在伴生对象中有自己的隐式 JSON 写入器

object Base {
   implicit val baseWrites: Writes[Base] = (...)(unlift(Base.unapply))
}

我继承了这个抽象类:

case class SubClass{...}

它的伴生对象中也有自己的隐式 JSON 写入器

object SubClass {
   implicit val subClassWrites: Writes[SubClass] = (...)(unlift(SubClass.unapply))
}

当我尝试使用 Json.toJson(SubClass) 序列化子类对象时,出现错误:

[error]  both value subClassWrites in object SubClass of type => play.api.libs.json.
Writes[models.SubClass]
[error]  and value baseWrites in object Base of type =>        
play.api.libs.json.Writes[models.Base]
[error]  match expected type play.api.libs.json.Writes[models.SubClass]
[error]  Ok(Json.toJson(SubClass.find(id)))

有什么办法可以消除歧义?

【问题讨论】:

    标签: json scala playframework playframework-2.0 implicits


    【解决方案1】:

    因为Writes 有一个逆变类型参数A,所以你遇到了冲突:

    trait Writes[-A] extends AnyRef
    

    这意味着Writes[Base]Writes[SubClass] 的子类 - 您可以在需要Writes[SubClass] 的地方使用Writes[Base]

    问题出在这里:

    val base: Base = new SubClass(...)
    val jsBase = Json.toJson(base)
    

    所以Writes[Base] 应该能够序列化SubClass 的实例。在这种情况下,您可以使用 ADT

    sealed trait Base
    object Base {
      implicit val baseWrites: Writes[Base] = 
        new Writes[Base]{
          def writes(o: Base): JsValue = o match {
            case s: SubClass => SubClass.writes.writes(s)
            case s: SubClass2 => SubClass2.writes.writes(s)
          }
        }
    }
    
    case class SubClass(...) extends Base
    object SubClass {
      val writes: Writes[SubClass] = (...)(unlift(SubClass.unapply))
    }
    
    case class SubClass2(...) extends Base
    object SubClass2 {
      val writes: Writes[SubClass2] = (...)(unlift(SubClass2.unapply))
    }
    

    使用 sealed 关键字,如果 match 不详尽,您会收到警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多