【发布时间】:2013-09-21 13:15:23
【问题描述】:
我有几个关于 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] {
^
谁能解释一下:
- 为什么构造函数定义中的其他参数不能使用容量参数?
- 为什么 ClassTag
ev不适用于默认参数值,即new Array[E](capacity)?
当我删除 elem 参数的默认值时 - 一切正常。
提前感谢您的任何回答。
【问题讨论】:
-
这可能不是一个完整的答案,但是:我认为
capacity实际上不在构造函数声明的范围内。就此而言,我不知道是否有任何语言允许交叉引用构造函数或函数参数;您只能在正文中访问它们。 -
@ViktorSeifert:引用
capacity不是问题。您只需将其移至附加参数组。这工作正常def test(a: Int)(b: Int = a) = a + b; test(1)()。但您无法访问下一组 (ev) 的参数。 -
@senia 这对构造函数有用吗?
-
@ViktorSeifert:您可以尝试一下:
class Test(a: Int)(b: Int = a) { val c = a + b }; new Test(1)().c工作正常。在其他情况下,您可以使用工厂方法。
标签: scala generics parameters constructor