Scala 的参数列表中带有 "..."的 Java 函数

标签 java scala variadic-functions

如所述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 给出了正确的答案:

  1. 从 scala 2.9 开始,可以与 java varargs 交互。只是通过条件
  2. 在此之前,您必须将您的参数作为数组传递,并输入 :_*

关于Scala 的参数列表中带有 "..."的 Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205118/

相关文章:

java - Hibernate 和父/子关系

scala - 如何使用 Scala Quill.io 库编写泛型函数

scala - 如何从给定的案例类创建行?

Scala 自己的 LLVM 实现

java - 为什么 varargs (Class<? extends Throwable>... t) "unchecked or unsafe"操作?

java - Dropbox API ListFolder 限制 2000 个条目

java - Spring 启动 + Gradle : how to build executable jar

java - checkin mvn 版本时出现 "Exception in thread "main"java.lang.UnsupportedClassVersionError : Bad version number in . class file"错误

c++ - 如何编写可变参数模板递归函数?

c++ - 可变参数 C++ 模板解压后终止?