【发布时间】:2016-01-15 01:33:51
【问题描述】:
我有一个使用以下签名的 Java 方法(来自 jOOQ):
Query query(String sql, Object... bindings);
现在,我想在 Scala 中用AnyVals 调用这个方法,例如:
val id = 2
val value = 3.14
query(someString, id, value)
这样做会给我以下编译器错误:
Error:(34, 16) overloaded method value query with alternatives:
(x$1: String,x$2: org.jooq.QueryPart*)org.jooq.Query <and>
(x$1: String,x$2: Object*)org.jooq.Query
cannot be applied to (String, Int, Double)
create.query(someString, id, lat)
^
但是,我可以将每个 AnyVal 显式转换为 AnyRef 以强制执行自动装箱,从而消除编译器错误:
query(someString, id.asInstanceOf[AnyRef], value.asInstanceOf[AnyRef])
意识到这一点,我虽然可以编写一个小函数,将所有对象转换为 AnyRef,如下所示:
def toVarargs(arg: Any, args: Any*): Array[AnyRef] = {
(arg +: args).map(_.asInstanceOf[AnyRef]).toArray
}
query(someString, toVarargs(id, value))
遗憾的是,这不起作用,因为 Array[AnyRef] 被解释为单个 varargs 变量(将其更改为 Array[Object] 没有任何区别)。
可以使用_* 运算符来完成这项工作:
query(someString, toVarargs(id, value): _*)
但是,这似乎相当冗长。有没有更优雅的解决方案来解决这个问题,或者我通过将我自己的函数与可变参数运算符相结合而陷入困境?
【问题讨论】:
标签: java scala variadic-functions jooq