dav*_*dsd 5 inheritance scala traits
我想定义一个Swappable具有两个值的特征x,y和一个swap方法,以便调用swap继承自的对象Swappable返回另一个具有x,y切换的相同类型的对象.到目前为止,我最好的是:
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 }
}
}
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的,因为swap的返回类型是一些匿名类,而不是我开始的原始类,所以我得到如下错误:
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
^
Run Code Online (Sandbox Code Playgroud)
有可能做我想做的事吗?交换的正确类型签名是什么?
我不知道该怎么做,但我想也许有助于更好地了解你想要发生什么.考虑像一个类
case class Foo(x: Int, y: Int) extends Swappable[Int] {
val z = x
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你有f = Foo(1, 2),应该f.swap给你一个Foo位置x != z?如果是这样,Scala内部就无法创建Foo类似的内容.如果没有,"交换x和y"真正意味着什么?
也许你真正想要的是这样的:
trait Swappable[A,T] {
this: A =>
val x: T
val y: T
def cons(x: T, y: T): A
def swap = cons(y, x)
}
case class Foo(x: Int, y: Int) extends Swappable[Foo,Int] {
val z = x
def cons(x: Int, y: Int) = copy(x=x, y=y)
}
Run Code Online (Sandbox Code Playgroud)
但我不确定.