2015-08-30 4 views
1

Я только заметил, что implicit def, похоже, не работает в var args.Неявный def с VarArgs

Например, у меня есть функция java, которая принимает в качестве входного параметра значение java.lang.Byte.... Вызов функции окружен методом 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

Неявное преобразование с параметром varargs не имеет особого смысла, поскольку вы используете параметр varargs, поэтому вам не нужно явно создавать коллекцию при вызове функции, но с неявной функцией преобразования, функция вызвал для вас автоматически.

Вы можете определить неявное преобразование из 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 
Смежные вопросы