使用VarArgs进行隐式def

时间:2015-08-30 21:44:15

标签: scala implicit-conversion implicit variadic-functions

我刚注意到implicit def似乎在var args中不起作用。

例如,我有一个以java.lang.Byte...作为参数输入的java函数。函数调用由scala方法环绕,该方法采用scala.Byte

  implicit def convertTest(bytes: Byte*): Seq[java.lang.Byte] = bytes.map(b => b : java.lang.Byte)

  def test(data: Byte*): Unit ={
    test2(convertTest(data: _*): _*)
  }

  def test2(data: java.lang.Byte*) = {

  }

出于某种原因,我必须明确键入 convertTest() 才能生效。

所以我尝试了没有varargs参数的东西,发现如果我这样做,它确实有效:

  implicit def convertTest(bytes: List[Byte]): java.util.List[java.lang.Byte] = bytes.map(b => b : java.lang.Byte).asJava

  def test(data: List[Byte]): Unit ={
    test2(data)
  }

  def test2(data: java.util.List[java.lang.Byte]) = {

  }

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

使用varargs参数进行隐式转换没有多大意义,因为您使用了varargs参数,因此在调用函数时不需要显式创建集合,但是使用隐式转换函数时,会调用该函数为你自动。

您可以定义从Seq[Byte]Seq[java.lang.Byte]的隐式转换(如第二个示例中所示),并仍使用testtest2中的varargs表示法(如在你的第一个例子中)。

implicit def convert(bytes: Seq[Byte]): Seq[java.lang.Byte] =
  bytes.map(b => b : java.lang.Byte)

def test(data: Byte*) = test2(data: _*)
def test2(data: java.lang.Byte*) = data.length

可以用作:

scala> test(1.toByte, 2.toByte)
res2: Int = 2

scala> test(1.toByte, 2.toByte, 3.toByte)
res3: Int = 3