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

标签 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. 为什么 capacity 参数不能用于构造函数定义中的其他参数?
  2. 为什么 ClassTag ev 不适用于默认参数值,即 new Array[E](capacity)

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

提前感谢您的回答。

最佳答案

您只能将先前参数列表中的值用作构造函数和方法中的默认值,而不是来自同一个:

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)
}

关于Scala:构造函数中具有默认参数值的通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18844101/

相关文章:

java - 使用泛型返回参数类的实例

Java数组特定行的总和

perl - 如何知道perl子例程是否带参数

scala - 获取 TrainValidationSplit scala 的最佳参数

json - 使用 play.api.libs.json 将对象序列化为 json

c# - 如何对泛型类进行排序?

sql - Entity Framework 、通用存储库模式和奇怪的 SQL 生成

Java servlet Filter 在 FilterConfig 中具有多个值?是否可以?

java - 关闭后如何重新连接kafka生产者?

scala - Scala 中的自增 (++) 运算符