3

我有一些关于 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. 为什么 ClassTagev不可用于默认参数值,即new Array[E](capacity)

当我删除 elem 参数的默认值时 - 一切正常。

提前感谢您的任何回答。

4

1 回答 1

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)
}
于 2013-09-17T08:17:09.790 回答