0

只是为了获得更多使用 Scala 的经验,作为一个实验,我正在实现一个具有类似ListAPI 的类,但它被实现为具有IndexedSeq第一个元素索引的列表;tail只返回一个索引递增的副本,并且添加Arrays 是 O(1),而添加Arrays 是 O(m),m = 列表长度 <= 元素数。

我的函数返回类型遇到问题。几乎每个方法都有类型参数[R >: T : ClassManifest, A <: R : ClassManifest]TBlockList. 有时这些方法只是返回其他方法,但在这些情况下,我从 Eclipse 收到一个错误,说它正在寻找 typeBlockList[R]但找到 type BlockList[Any]。不应该是和R的最低常见超类型吗?在这种情况下,第二个方法调用也应该返回,对吗?我没有得到什么?我反思了很多来克服类型擦除的问题,但我不知道它是否仍然是一个问题。 TABlockList[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

}
4

1 回答 1

3

R 不应该是 T 和 A 中最低的通用超类型吗?

不,因为R是一个上限。R可以是的任何超类T,并且唯一满足该界限的类是Any

例如,想象一下——R然后AnyRef您可以调用诸如on 之类的方法,如果传递eq了 an ,它将中断。Int

因此,虽然R 可能低于Any(并且可能在大多数情况下),但在您声明它时,不能假设它低于Any.

但是,我认为以上内容与您的问题无关。您报告的错误出现在这些行中,对吗?

Array[R](x) |: this
this :| Array[R](x)

另一个也有一个:|。您没有显示任何从Arrayto的隐式转换Build,并且没有任何:|方法采用Arrayas 参数(数组不是IndexedSeq)。

所以,当你写

this :| Array[R](x)

这将调用(def |: [R1 >: T : ClassManifest, A <: R1] (x: A): BlockList[R1]我已更改RR1nto以与R参数AArray[R]TArray[R]AnyR1AnyAnyR

也许,如果你称它为this.:|[R, Array[R]](Array[R](x)), it would move things a little further. With the missing definitions that allowArray` 来传递,我无法预测其他太多。

于 2013-09-30T03:55:22.337 回答