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
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)