1

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

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

    res: _*
  }

  // […]
}

whereconvBools2Bytes是将 an 转换Array[Boolean]为 an的函数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]转换为重复参数列表(如“Scala 编程”第 2 版第 8.8 节中所述)。

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

4

1 回答 1

6

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

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

否则这也应该没问题

this(convBools2Bytes(data): _*)

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

于 2012-07-23T20:48:30.390 回答