Я не мог сделать это с типом member, но здесь вы версия с параметрами типа. Также необходимо добавить метод в Foo для создания объекта.
trait Foo[F, T] {
def aa(foo: F): List[T]
def maybe(foo: F): Option[T]
def instance(aa: List[T], maybe: Option[T]): F
}
class Bar(val aa: List[String], val maybe: Option[String]) {
override def toString = s"Bar($aa, $maybe)"
}
object Bar {
implicit val barFoo = new Foo[Bar, String] {
def aa(foo: Bar): List[String] = foo.aa
def maybe(foo: Bar): Option[String] = foo.maybe
def instance(aa: List[String], maybe:Option[String]):Bar = new Bar(aa, maybe)
}
}
implicit class FooOps[A, T](fooable:A)(implicit foo:Foo[A, T]) {
def copy(aa: List[T] = foo.aa(fooable), maybe: Option[T] = foo.maybe(fooable)) = {
foo.instance(aa, maybe)
}
}
val r = new Bar(List(""), Option("")).copy(aa = List("asd"))
println(r)