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

Scala 重载构造函数中的重复参数,scala,constructor,variadic-functions,Scala,Constructor,Variadic Functions,我想用Scala编写一个类,它可以接受任意数量的字节或布尔值,就像这样 类字节数据:字节*{ def thisdata:Boolean*=此{ val res:Array[Byte]=convBools2Bytesdata res:_* } // […] } 其中,convBools2Bytes是一个将数组[Boolean]转换为数组[Byte]的函数: def convbools2bytes数据:数组[布尔]:数组[字节] 这会导致以下编译器错误: [error] Bytes.scala:5:

我想用Scala编写一个类,它可以接受任意数量的字节或布尔值,就像这样

类字节数据:字节*{ def thisdata:Boolean*=此{ val res:Array[Byte]=convBools2Bytesdata res:_* } // […] } 其中,convBools2Bytes是一个将数组[Boolean]转换为数组[Byte]的函数:

def convbools2bytes数据:数组[布尔]:数组[字节] 这会导致以下编译器错误:

[error] Bytes.scala:5: no `: _*' annotation allowed here
[error] (such annotations are only allowed in arguments to *-parameters)
[error]     res: _*
[error]        ^
据我所知,res:*语句将数组[Byte]转换为重复参数列表,如中第8.8节所述


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

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

this({
  val res: Array[Byte] = convBools2Bytes(data)
  res
}: _*)
否则也可以

this(convBools2Bytes(data): _*)
但您将遇到另一个问题,擦除将导致两者具有相同的签名并阻止编译。
我认为您最好不要重载,正如编译器所说,您只能在vararg参数的参数中使用它。您试图让块返回扩展的vararg列表,这是不允许的。 如果您想使用该块,则:

this({
  val res: Array[Byte] = convBools2Bytes(data)
  res
}: _*)
否则也可以

this(convBools2Bytes(data): _*)
但您将遇到另一个问题,擦除将导致两者具有相同的签名并阻止编译。
我想你最好不要重载

我认为数组是特例,不会被擦除是的,但是使用varargs的方法会被编译成使用scala.collection.Seq的方法。谢谢,Kaito。你的最后一句话是对的:现在我得到了一个双重定义错误。有什么方法可以绕过它吗?我修改了主构造函数以直接获取数组[Byte]。我在标准库中发现的一个技巧是显式指定一个额外的元素,例如。g、 :def foox:Int,xs:Int*我认为数组是特例,不会被擦除。是的,但是使用varargs的方法会被编译成使用scala.collection.Seq的方法。谢谢,Kaito。你的最后一句话是对的:现在我得到了一个双重定义错误。有什么方法可以绕过它吗?我修改了主构造函数以直接获取数组[Byte]。我在标准库中发现的一个技巧是显式指定一个额外的元素,例如。g、 :def foox:Int,xs:Int*我刚刚插入了convBools2Bytes,以澄清问题。我没想过。在实际的实现中,这个块中有很多代码。所以在这个例子中,它真的毫无意义。我只是插入了convBools2Bytes,以使事情更清楚。我没想过。在实际的实现中,这个块中有很多代码。所以在这个例子中,它真的毫无意义。