只是为了获得更多使用 Scala 的经验,作为一个实验,我正在实现一个具有类似List
API 的类,但它被实现为具有IndexedSeq
第一个元素索引的列表;tail
只返回一个索引递增的副本,并且添加Array
s 是 O(1),而添加Array
s 是 O(m),m = 列表长度 <= 元素数。
我的函数返回类型遇到问题。几乎每个方法都有类型参数[R >: T : ClassManifest, A <: R : ClassManifest]
,T
即BlockList
. 有时这些方法只是返回其他方法,但在这些情况下,我从 Eclipse 收到一个错误,说它正在寻找 typeBlockList[R]
但找到 type BlockList[Any]
。不应该是和R
的最低常见超类型吗?在这种情况下,第二个方法调用也应该返回,对吗?我没有得到什么?我反思了很多来克服类型擦除的问题,但我不知道它是否仍然是一个问题。 T
A
BlockList[R]
ClassManifest
错误来自 和 的|:
定义:|
。
import collection.immutable.List
import reflect.ClassManifest
import annotation.tailrec
sealed abstract
class BlockList [+T] extends Seq[T] with Product {
...
}
object EmptyBlock extends BlockList[Nothing] {
...
}
class Build [T: ClassManifest](
private val block: IndexedSeq[T],
private val next: BlockList[T] = EmptyBlock,
private val index: Int = 0
) extends BlockList[T] {
require(!block.isEmpty && index >= 0 && index < block.length)
override def |: [R >: T : ClassManifest, A <: R] (x: A): BlockList[R] =
Array[R](x) |: this //Return type error here
override def |: [R >: T : ClassManifest, A <: R : ClassManifest]
(blk: IndexedSeq[A]): BlockList[R] =
if (blk isEmpty) this
else new Build[R](blk, this)
override def :| [R >: T : ClassManifest, A <: R] (x: A): BlockList[R] =
this :| Array[R](x) //Return type error here
override def :| [R >: T : ClassManifest, A <: R : ClassManifest]
(blk: IndexedSeq[A]): BlockList[R] =
if (blk isEmpty) this
else new Build[R](block, next :| blk, index) //Type error here
}