voglio definire un tratto Swappable
con due valori x,y
e un metodo swap
tale che chiamare swap
su un oggetto che eredita dalla Swappable
rendimenti un'altra oggetto dello stesso tipo con x,y
acceso. Il mio migliore finora è:Trait swap a 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 }
}
}
Ma questo non è quello che voglio, perché il tipo di ritorno di swap è una certa classe anonima, al posto della classe originale ho iniziato con, in modo da ottenere gli errori come:
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
^
È possibile fare ciò che sto cercando di fare? Qual è la firma del tipo corretto per lo swap?
Very nice! Fai un buon punto che la nozione di scambio non è chiara in generale. Nella mia situazione, estenderò solo "Scambiabile" con le classi caso "Foo (x: T, y: T)" che non contengono valori aggiuntivi, ma non c'è molto altro modo per Scala di saperlo. Quindi penso che lascerò l'implementazione del metodo 'swap' a ciascuna classe ereditaria (che è fondamentalmente ciò che fai, attraverso il metodo extra' cons'). La chiave per fare ciò (che non avevo pensato) sta passando nel parametro di tipo extra 'A' a' Swappable', che consente alle classi ereditarie di dettare quale dovrebbe essere il tipo di ritorno. Grazie! – davidsd