子类类型的隐式写

用户名

我有一个班级的人和一个班级的雇员。班级员工扩展了班级人员。

我当前将类转换为JSON的隐式写入如下所示:

implicit val implicitPersonWrites = new Writes[Person] {
  def writes(v: Person): JsValue = {
    Json.obj("label" -> v.label, "age" -> v.age)
  }
}

implicit val implicitEmployeeWrites = new Writes[Employee] {
  def writes(v: Employee): JsValue = {
    Json.obj("label" -> v.label, "age" -> v.age, "company" -> v.company)
  }
}

问题在于,即使我的对象是Employee类型,也始终使用Person超类的隐式写入。因此,最后,输出中不存在特定于Employee类的字段。在继承的情况下如何正确进行隐式写入?

阿列克谢·罗曼诺夫(Alexey Romanov)

三种选择:

  1. (在大多数情况下最好)使用合成代替继承。而不是class Employee(...) extends Person(...))拥有class Employee(person: Person, company: String)

  2. 如果您具有固定的子类层次结构,那么正如您在注释中提到的,请分派in中的类型implicitPersonWrites这不是特别丑陋。总是在OptionList等等发生这种情况理想情况下,您可以将其Person转换为代数数据类型。

  3. 使用您拥有的继承:

    implicit val implicitPersonWrites = new Writes[Person] {
      def writes(v: Person): JsValue = v.toJsValue
    }
    
    // no implicitEmployeeWrites 
    
    class Person(...) {
      def toJsValue = Json.obj("label" -> label, "age" -> age)
    }
    
    class Employee(...) extends Person(...) {
      override def toJsValue = Json.obj("label" -> label, "age" -> age, "company" -> company)
    }
    

    这有明显的缺点:

    1. Person现在子类必须了解JsValues;

    2. 这只能像的情况下进行Writes,其中类型参数作为参数

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

泛型类的子类型的隐式类

来自分类Dev

Scala隐式宏:按子类型过滤类型成员(tpe.decls)

来自分类Dev

类型相关的隐式

来自分类Dev

Haskell类型隐式

来自分类Dev

在Scala中,如何将隐式转换应用于集合的子类型?

来自分类Dev

用子类型扩展scalaz中的Enum和隐式参数

来自分类Dev

旁写和隐式返回

来自分类Dev

为什么在隐式 def 中为可变参数传入单个子类型会导致类型不匹配?

来自分类Dev

隐式类型和通配符

来自分类Dev

依赖类型的隐式扩展

来自分类Dev

快速隐式转换类型

来自分类Dev

C ++隐式类型转换

来自分类Dev

函数类型的隐式转换

来自分类Dev

隐式使用结构类型

来自分类Dev

C ++隐式类型转换

来自分类Dev

无法隐式转换类型

来自分类Dev

显式/隐式类型转换C ++

来自分类Dev

显式/隐式类型转换C ++

来自分类Dev

类和子类之间的隐式和显式转换

来自分类Dev

如何将其写为隐式递归?

来自分类Dev

数组参数传递:写时复制是隐式的吗?

来自分类Dev

如何获得隐式链接到基类的子类?

来自分类Dev

在子类中重用json隐式读取器

来自分类Dev

带Swift3的子类CALayer +隐式动画

来自分类Dev

隐式参数和类型族

来自分类Dev

groovy隐式函数参数类型转换

来自分类Dev

在泛型类隐式类型参数

来自分类Dev

变量“ a”隐式具有“ any []”类型

来自分类Dev

类型声明隐式为静态成员