如所述here
如果你想让代码编译,你必须将 :_*
关键字添加到 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[?]
有什么想法吗?
最佳答案
你不能在这里使用:_*
。
_*
存在的原因是可变参数可能导致歧义。
在 java 中如果你有 f(int... values)
你可以调用 f(1, 2, 3)
,但也有 do
int[] values = {1, 2, 3};
f(values)
用int就可以了。但是如果你有 f(object.. values)
并且有 object[] values = {"a", "b"}
,当调用 f(values )
,这应该意味着 f 被调用时带有单个 arg,即 values
,还是带有多个 args "a"
和 "b “
? (java选择后者)。
为了避免这种情况,在 scala 中,当有可变参数时,不允许将它们作为数组(实际上是 scala 中更通用的 Seq
)参数传递,除非你明确地说你正在做因此,通过放置缩写 :_*
。对于前面的示例,f(values)
表示值是单个参数。 f(values: _*)
表示 values 的每个元素,无论是零、一个还是多个,都是一个参数。
在您的特定情况下,您将 Predicate
参数(实际上只是一个)作为单独的(好吧...)谓词传递,而不是作为谓词的集合传递。所以没有 :_*
编辑:我更仔细地阅读了您链接到的帖子。虽然我当然相信我上面写的是真的,但它可能没有帮助。 MxFr 给出了正确的答案:
- 从 scala 2.9 开始,可以与 java varargs 交互。只是通过条件
- 在此之前,您必须将您的参数作为数组传递,并输入 :_*
关于Scala 的参数列表中带有 "..."的 Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205118/