Использование методов Scala Vararg в Java - PullRequest
10 голосов
/ 29 ноября 2011

Почему все методы scala vararg, когда они используются из java, похоже, принимают Seq переменных и не могут использоваться в качестве нативных java-методов vararg. Это ошибка?

Например, Buffer имеет метод def append(elems: A*): Unit. Но в Java это имеет другую подпись: void append(Seq<A>).

Ответы [ 3 ]

17 голосов
/ 31 октября 2012

Если вы управляете кодом scala, вы можете использовать @varargs, чтобы он генерировал java-совместимый метод varags, например, @varargs def append(elems: A*): Unit = {}

8 голосов
/ 29 ноября 2011

Это не ошибка.Это выбор дизайна, который предпочитает использование vararg в Scala, а не совместимость с Java.Например, он позволяет вам передавать List в метод Scala varargs без необходимости конвертировать его в Array по пути.

Если вам нужно использовать Scala varargs из Java, вам следует создатьвместо этого немного scala Seq.Например, вы можете написать оболочку Java для автоматического создания массива, а затем использовать метод genericWrapArray из объекта Predef.

0 голосов
/ 29 ноября 2011

Вы можете легко разыграть Seq в варагонах, используя :_* Например:

val b = collection.mutable.ListBuffer.empty[Int]
b.append(List(1, 2):_*)

, чтобы избежать дублирования кода в API коллекции.

Вы также можете просто использовать appendAll:

b.appendAll((List(1, 2))
...