Я хочу, чтобы определить Swappable
черта с двумя значениями x,y
и swap
метода, такие, что вызов swap
на объекте наследует от Swappable
возвращает другой объект тех же типа с x,y
коммутации каналов. Мой лучший до сих пор:Swappable Тра в Scala
trait Swappable[T] {
val x: T
val y: T
def swap: Swappable[T] = {
val (a,b) = (x,y)
new Swappable[T] { val x=b; val y=a }
}
}
Но это не то, что я хочу, потому что тип возвращаемого свопа некоторый анонимный класс, вместо оригинального класса я начал с, так что я получаю ошибки как:
def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap
<console>:32: error: type mismatch;
found : Swappable[Int]
required: S
def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap
^
Можно ли делать то, что я пытаюсь сделать? Какая правильная сигнатура типа для swap?
Очень приятно! Вы хорошо понимаете, что понятие обкатки в целом неясно. В моей ситуации я буду расширять «Swappable» классами case «Foo (x: T, y: T)», которые не содержат дополнительных значений, но Scala не знает об этом. Поэтому я предполагаю, что я оставлю реализацию метода swap для каждого наследующего класса (что в основном вы делаете с помощью дополнительного метода 'cons'). Ключ для этого (что я и не думал) передает дополнительный параметр типа «A» на «Swappable», который позволяет наследовать классы, чтобы определить тип возвращаемого типа. Благодаря! – davidsd