Quiero definir un rasgo Swappable
con dos valores x,y
y un método swap
tal que llamar swap
sobre un objeto que hereda de Swappable
retornos otro objeto del mismo tipo con x,y
conmutada. Mi mejor hasta ahora es:Trait Swappable en 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 }
}
}
Pero esto no es lo que quiero, porque el tipo de retorno de intercambio es cierta clase anónima, en lugar de la clase original Empecé con, por lo que tengo errores como:
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
^
¿Es posible hacer lo que estoy tratando de hacer? ¿Cuál es la firma de tipo correcta para el intercambio?
muy agradable! Señala que la noción de intercambio no está clara en general. En mi situación, solo extenderé 'Swappable' con las clases de casos' Foo (x: T, y: T) 'que no contienen valores adicionales, pero Scala no tiene mucha información para saberlo. Así que supongo que dejaré la implementación del método 'swap' para cada clase heredada (que es básicamente lo que haces, a través del método adicional' contras'). La clave para hacer esto (que no había pensado) es pasar el parámetro de tipo extra 'A' a 'Swappable', que permite que las clases heredadas dicten cuál debería ser el tipo de retorno. ¡Gracias! – davidsd