我想定义一个名为
但这不是我想要的,因为 swap 的返回类型是某个匿名类,而不是我最初使用的原始类,所以我会遇到以下错误:
Swappable
的特质,它有两个值x,y
和一个swap
方法。调用继承自Swappable
的对象上的swap
方法会返回另一个类型相同的对象,其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 }
}
}
但这不是我想要的,因为 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
^
我是否能做到我正在尝试做的事情?交换的正确类型签名是什么?
Foo(x: T, y: T)
扩展Swappable
,但是Scala没有太多的方法来知道这一点。所以我想我会把swap
方法的实现留给每个继承类(基本上就是通过额外的方法cons
来实现)。做到这一点的关键(我之前没有想到)是向Swappable
传递额外的类型参数A
,这使得继承类可以指定返回类型应该是什么。谢谢! - davidsd