полагаться на методы класса в черте
Есть ли способ полагаться на методы, определенные в классе case в черте? Например, копия: следующее не работает. Хотя я не знаю почему.
trait K[T <: K[T]] {
val x: String
val y: String
def m: T = copy(x = "hello")
def copy(x: String = this.x, y: String = this.y): T
}
case class L(val x: String, val y: String) extends K[L]
Дает:
error: class L needs to be abstract, since method copy in trait K of type
(x: String,y: String)L is not defined
case class L(val x: String, val y: String) extends K[L]
^
3 ответа:
Я предполагаю, что наличие метода с именем copy в черте указывает компилятору не генерировать метод copy в классе case-поэтому в вашем примере метод copy не реализован в вашем классе case. Ниже приведен краткий эксперимент с методом копирования, реализованным в trait:
scala> trait K[T <: K[T]] { | val x: String | val y: String | def m: T = copy(x = "hello") | def copy(x: String = this.x, y: String = this.y): T = {println("I'm from trait"); null.asInstanceOf[T]} | } defined trait K scala> case class L(val x: String, val y: String) extends K[L] defined class L scala> val c = L("x","y") c: L = L(x,y) scala> val d = c.copy() I'm from trait d: L = null
Решение состоит в том, чтобы объявить, что ваш признак должен быть применен к классу с помощью метода копирования:
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
".