Поведение, которого вы пытаетесь достичь, не реализуемо. copy
метод класса case автоматически генерируется компилятором, и как только вы добавляете метод с именем copy
в вашу реализацию, компилятор не будет генерировать никакого сахара.
Вы можете переопределить copy
с чертами, но он не будет таким гибким, как сгенерированный (вам придется обновлять базовые черты, реализации copy
и method
каждый раз, когда набор полей в случае изменения класса):
sealed trait Base[T] {
val s: Option[String]
def copy(s: Option[String]) : T
}
case class CaseClass(override val s: Option[String] = None) extends Base[CaseClass] {
override def copy(s: Option[String]) = CaseClass(s)
}
def method[T <: Base[T]](base : Base[T]) = base copy (s = Some("strng"))
В качестве альтернативы вы можете реализовать method
следующим образом:
case class CaseClass(s: Option[String] = None)
def method[X <: {def copy(s: Option[String]):X}](base : X) =
base copy(s = Some("string"))
scala> method(CaseClass())
res4: CaseClass = CaseClass(Some(string))
Таким образом, вам не понадобится черта Base
и уменьшите количество изменений, если ваши классы дел изменятся.