我想定义一个 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 }
}
}
但这不是我想要的,因为交换的返回类型是某个匿名类,而不是我开始使用的原始类,所以我收到如下错误:
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
^
有可能做我想做的事吗?交换的正确类型签名是什么?
最佳答案
我不知道该怎么做,但我认为这可能有助于更好地了解您想要发生的事情。考虑一个类
case class Foo(x: Int, y: Int) extends Swappable[Int] {
val z = x
}
现在,如果您有
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)
}
但我不确定。
关于scala - Scala 中的可交换特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842840/