Вы не должны использовать :_*
здесь.
Существует причина, по которой существует _*
, заключается в том, что varargs может привести к двусмысленности.
В Java Если у вас есть f(int... values)
, вы можете позвонить f(1, 2, 3)
, но также можете сделать
int[] values = {1, 2, 3};
f(values)
С целыми числами это нормально. Но если у вас есть f(object.. values)
и object[] values = {"a", "b"}
при вызове f(values)
, должно ли это означать, что f вызывается с одним аргументом, который является values
, или с несколькими аргументами "a"
и "b"
? (Ява выбирает позже).
Во избежание этого в scala, когда есть varargs, нельзя передавать их как аргументы массивов (на самом деле это более общий Seq
в scala) аргумент, за исключением случаев, когда вы явно говорите, что делаете это, помещая воздержание :_*
. В предыдущем примере f(values)
означает, что значения являются единственным аргументом. f(values: _*)
означает, что каждый элемент значений, будь то ноль, один или много, является аргументом.
В вашем конкретном случае вы передаете Predicate
аргументы (фактически только один) как отдельные (хорошо ...) предикаты, а не как набор предикатов. Так что нет: _*
Редактировать : Я прочитал пост, на который вы ссылались, более внимательно. Хотя то, что я, конечно, верю в то, что я написал выше, правда, это, вероятно, не полезно. Правильный ответ дал MxFr:
- Начиная с Scala 2.9, взаимодействие с Java Varargs в порядке. просто передайте условие
- Перед этим вы должны передать свои аргументы в виде массива и поставить: _ *