这是场景。我想实现一个带有类型成员的类,例如,类型为E的元素的列表。在这个类中,我们有一个根据参数创建新列表的方法,我们有两个实现,BigList和SmallList。
一切看起来都不错。但是,我仍然希望在类型E上专门化一些实现。例如,我们有IntList,并且还有一些操作。这是问题所在。
当我尝试在IntList中使用take
时,我希望得到一个IntList而不是List [Int],有点像它返回魔法this.type
。假设BigList和SmallList实现独立于类型E的值,这意味着如果我在IntList中重写方法take
,它将是相同的,除了返回类型,我不想复制那个实现。我知道BigList和SmallList本身并不是IntList,但我在建模时遇到了麻烦,也许这不是正确的方法,这只是展示用例的一个例子。一种可能性是使用像BigList[E, This <: BigList[E, This]]
这样的f-bounded多态,BigList可以表示各种List,IntList等。但是我没有让它发挥作用,而且它很复杂。
实现这一目标的理想方法是什么?
class List[E](val head: E, val tail: List[E]) {
def take(n: Int): List[E] = {
if (n < 5) new SmallList[E](this.head, tail.take(n - 1))
else new BigList[E](this.head, tail.take(n - 1))
}
}
class BigList[E](head: E, tail: List[E]) extends List[E](head, tail) {
...
}
class SmallList[E](head: E, tail: List[E]) extends List[E](head, tail) {
...
}
class IntList(head: Int, tail: List[Int]) extends List[Int](head, tail) {
def intSum: Int = ...
def take(x: Int): IntList = {
if (n < 5) new SmallList[E](this.head, tail.take(n - 1))
else new BigList[E](this.head, tail.take(n - 1))
}
}