Решение состоит в том, чтобы объявить, что ваша черта должна быть применена к классу с методом копирования:
trait K[T <: K[T]] {this: {def copy(x: String, y: String): T} =>
val x: String
val y: String
def m: T = copy(x = "hello", y)
}
(к сожалению, вы не можете использовать неявный параметр в методе копирования, так как неявное объявление не разрешено в объявлении типа)
Тогда ваша декларация в порядке:
case class L(val x: String, val y: String) extends K[L]
(проверено в REPL scala 2.8.1)
Причина, по которой ваша попытка не работает, объясняется в решении, предложенном другими пользователями: ваше объявление copy
блокирует генерацию метода "case copy
".