Scala:构造函数中具有默认参数值的通用数组

时间:2013-09-17 07:45:23

标签: scala generics parameters constructor

我有一些关于scala泛型和默认参数值的问题。

假设我有以下类定义(其中Stack [E]是特征)

class ImmutableStack[E](capacity: Int = 10, elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E]) extends Stack[E]

当我尝试编译该代码时,它会产生两个错误:

scala: cannot find class tag for element type E
class ImmutableStack[E <: Any](capacity: Int = 10, elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E]) extends SedgewickStack[E] {
                                                                 ^

scala: not found: value capacity
class ImmutableStack[E <: Any](capacity: Int = 10, elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E]) extends SedgewickStack[E] {
                                                                                  ^

有人可以解释一下:

  1. 为什么容量参数不能用于构造函数定义中的其他参数?
  2. 为什么ClassTag ev不可用于默认参数值,即new Array[E](capacity)
  3. 当我删除elem参数的默认值时 - 一切正常。

    提前感谢您的回答。

1 个答案:

答案 0 :(得分:1)

您只能将以前参数列表中的值用于构造函数和方法中的默认值,而不能使用相同的值:

class ImmutableStack[E <: Any](capacity: Int = 10)(elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E])

要解决无法使用隐式类标记的问题,我能提供的最好的是

class ImmutableStack[E <: Any : ClassTag](capacity: Int = 10)(elems: Array[E] = null) {
  val realElems = if (elems != null) elems else new Array[E](capacity)
}