使用 VarArgs 的隐式 def
Implicit def with VarArgs
我刚刚注意到 implicit def
似乎在 var args 中不起作用。
例如,我有一个 java 函数,它以 java.lang.Byte...
作为参数输入。函数调用被采用 scala.Byte
的 Scala 方法包围。
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]) = {
}
谁能给我解释一下吗?
带有可变参数的隐式转换没有多大意义,因为你使用了可变参数,所以你在调用函数时不需要显式地创建一个集合,但是带有隐式转换函数,函数自动为您呼叫。
您可以定义从 Seq[Byte]
到 Seq[java.lang.Byte]
的隐式转换(就像在您的第二个示例中一样),并且仍然在 test
和 test2
中使用可变参数表示法(就像你的第一个例子)。
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
我刚刚注意到 implicit def
似乎在 var args 中不起作用。
例如,我有一个 java 函数,它以 java.lang.Byte...
作为参数输入。函数调用被采用 scala.Byte
的 Scala 方法包围。
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]) = {
}
谁能给我解释一下吗?
带有可变参数的隐式转换没有多大意义,因为你使用了可变参数,所以你在调用函数时不需要显式地创建一个集合,但是带有隐式转换函数,函数自动为您呼叫。
您可以定义从 Seq[Byte]
到 Seq[java.lang.Byte]
的隐式转换(就像在您的第二个示例中一样),并且仍然在 test
和 test2
中使用可变参数表示法(就像你的第一个例子)。
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