我有一些关于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] {
^
有人可以解释一下:
ev
不可用于默认参数值,即new Array[E](capacity)
?当我删除elem参数的默认值时 - 一切正常。
提前感谢您的回答。
答案 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)
}