Case to case inheritance in Scala

前端 未结 2 876
Happy的楠姐
Happy的楠姐 2020-12-14 20:59

I have an abstract class which I extend and make numerous case classes. Now I want to copy instances of those case classes just changing first parameter, so I use case class

2条回答
  •  太阳男子
    2020-12-14 21:26

    You can't abstract over case class' copy methods generically. I'd suggest using Lenses from Shapeless or Monocle:

    trait Organism { def legs: Int }
    // monocle @Lenses uses a macro to generate lenses
    @Lenses case class Octopus(override val legs: Int, weight: Double, ...)
      extends Organism
    @Lenses case class Frog(val legs: Int, ...) extends Organism
    
    def clone[O <: Organism](o: O, legsLens: Lens[O, Int]): O =
      legsLens.set(-1)(o)
    
    val myOctopus = Octopus(8, 2.4, ...)
    val myFrog = Frog(2, ...)
    
    // use the generated Lenses
    val cloneOctopus: Octopus = clone(myOctopus, Octopus.legs)
    clone(myFrog, Frog.legs)
    

提交回复
热议问题