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

pvo*_*orb 1 constructor scala variadic-functions

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

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

    res: _*
  }

  // […]
}
Run Code Online (Sandbox Code Playgroud)

其中convBools2Bytes是一个转换函数Array[Boolean]Array[Byte]:

def convBools2Bytes(data: Array[Boolean]): Array[Byte]
Run Code Online (Sandbox Code Playgroud)

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

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

据我了解,该res: _*语句将Array[Byte]转换为重复参数列表(如"Scala编程"第2章第8节中所述).

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

Kai*_*ito 6

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

this({
  val res: Array[Byte] = convBools2Bytes(data)
  res
}: _*)
Run Code Online (Sandbox Code Playgroud)

否则这也应该没问题

this(convBools2Bytes(data): _*)
Run Code Online (Sandbox Code Playgroud)

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