重载构造函数中的重复参数

时间:2012-07-23 20:24:06

标签: scala constructor variadic-functions

我想在Scala中编写一个类,它采用任意数量的字节或像这样的布尔值

class Bytes(data: Byte*) {
  def this(data: Boolean*) = this {
    val res: Array[Byte] = convBools2Bytes(data)

    res: _*
  }

  // […]
}

其中convBools2Bytes是将Array[Boolean]转换为Array[Byte]的函数:

def convBools2Bytes(data: Array[Boolean]): Array[Byte]

这给了我以下编译器错误:

[error] Bytes.scala:5: no `: _*' annotation allowed here
[error] (such annotations are only allowed in arguments to *-parameters)
[error]     res: _*
[error]        ^

据我了解,res: _*语句将Array[Byte]转换为重复参数列表(如“Programming in Scala”, 2nd Ed.中第8.8节所述)。

为什么会出现这样的错误,我该如何避免呢?

1 个答案:

答案 0 :(得分:6)

正如编译器所说,你可能只在vararg参数的参数中使用它。您试图让块返回扩展的vararg列表,这是不允许的。 如果你想使用该块,那么:

this({
  val res: Array[Byte] = convBools2Bytes(data)
  res
}: _*)

否则这也应该没问题

this(convBools2Bytes(data): _*)

但是你会遇到另一个问题,擦除会导致两者都有相同的签名并阻止编译。 我认为你最好不要超载