Java-функция с "..." в списке параметров из Scala - PullRequest
4 голосов
/ 26 августа 2011

Как описано здесь

Если вы хотите скомпилировать код, вам нужно добавить ключевое слово :_* к condition:Predicate

Теперь у меня есть этопроблема

val queryBuilder = em.getCriteriaBuilder()
     val cq = queryBuilder.createQuery(classOf[Product])
     val product:Root[Product] = cq.from(classOf[Product])
     val condition:Predicate = queryBuilder.equal(product.get("name"), "name")
     --> cq.where(condition:_*)


Multiple markers at this line
- type mismatch; found : javax.persistence.criteria.Predicate required: Seq[?]

Есть идеи?

Ответы [ 3 ]

8 голосов
/ 26 августа 2011

Вы не должны использовать :_* здесь.

Существует причина, по которой существует _*, заключается в том, что 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:

  1. Начиная с Scala 2.9, взаимодействие с Java Varargs в порядке. просто передайте условие
  2. Перед этим вы должны передать свои аргументы в виде массива и поставить: _ *
3 голосов
/ 26 августа 2011

С Scala 2.9 cq.where(condition) должно работать, даже cq.where(condition1, condition2) должно работать.

В качестве альтернативы вы можете использовать cq.where(Array(condition):_*).

0 голосов
/ 29 августа 2011

Я использую библиотеку Scala 2.9.0.1.Это ошибка компилятора для этого кода, только передавая условие:

[ERROR]     D:\Mazi\Develop\workspaces\scala\sshwWebApp\src\main\scala\com\example\app\dao\DefaultProductDao.scala:54: error: ambiguous referenc
    e to overloaded definition,
    [INFO] both method where in trait CriteriaQuery of type (x$1: <repeated...>[javax.persistence.criteria.Predicate])javax.persistence.criteria
    .CriteriaQuery[com.example.app.domain.Product]
    [INFO] and  method where in trait CriteriaQuery of type (x$1: javax.persistence.criteria.Expression[java.lang.Boolean])javax.persistence.cri
    teria.CriteriaQuery[com.example.app.domain.Product]
    [INFO] match argument types (javax.persistence.criteria.Predicate)
    [INFO]      cq.where(condition)
    [INFO]         ^

В чем проблема?

Если я использую

cq.where(Array(condition):_*)

, я получаю то же самоеошибка компилятора:

[ERROR] D:\Mazi\Develop\workspaces\scala\sshwWebApp\src\main\scala\com\example\app\dao\DefaultProductDao.scala:54: error: ambiguous referenc
e to overloaded definition,
[INFO] both method where in trait CriteriaQuery of type (x$1: <repeated...>[javax.persistence.criteria.Predicate])javax.persistence.criteria
.CriteriaQuery[com.example.app.domain.Product]
[INFO] and  method where in trait CriteriaQuery of type (x$1: javax.persistence.criteria.Expression[java.lang.Boolean])javax.persistence.cri
teria.CriteriaQuery[com.example.app.domain.Product]
[INFO] match argument types (javax.persistence.criteria.Predicate)
[INFO]      cq.where(Array(condition):_*)
[INFO]         ^

Может быть, компилятор scala, который я использую?

K И от имени Массимо

...