gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:23:27 24 4
gpt4 key购买 nike

如所述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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com