Java 如何调用数组的vararg方法?

Java 如何调用数组的vararg方法?,java,jooq,Java,Jooq,我在jooqapi中发现了一个奇怪的方法 Batch batch(Query query, Object[]... bindings); 我很好奇如何在不手动指定参数的情况下调用它 public int g(Object[]... args) { return args.length; } 失败: assertEquals(2, g(new Object[] { new Object[0], new Object[0] })); 测试失败,因为Java隐式地为三点符号创建了一个数组

我在jooqapi中发现了一个奇怪的方法

Batch batch(Query query, Object[]... bindings);
我很好奇如何在不手动指定参数的情况下调用它

public int g(Object[]... args) {
    return args.length;
}
失败:

assertEquals(2, g(new Object[] { new Object[0], new Object[0] }));

测试失败,因为Java隐式地为三点符号创建了一个数组。在您的例子中,方法g获得一个包含一个元素的数组,该数组的第一个元素也是一个数组(您的数组包含两个
对象的实例)

因此,您可以省略额外的数组:

assertEquals(2, g(new Object[0], new Object[0]));
因此,您可以使用
batch()
方法,只需通过显式数组传递vararg参数:

batch(query, new Object(), new Object())
API是什么意思? API的目的是以矩阵形式为批处理语句提供一组绑定值,其中每个外部数组元素对应于批处理中的单个语句,每个内部数组元素对应于一个绑定值

它叫什么名字? 有几种方法。让我们在这里假设这个查询:

Query query = DSL.query("INSERT INTO t(a, b) VALUES (?, ?)", null, null);
例如,使用Java中的经典矩阵创建(varargs在这里没有帮助):

或者,通过使用单个数组(这是varargs可能提供帮助的地方):

如果您有一些预先存在的jOOQ记录结构,并且希望将它们作为绑定变量传递给批处理,则后者尤其有用,例如,通过使用:


如果问题正确,则需要
Object[]
s作为
batch
的参数,而不是
Object
s。
batch(query, new Object[][] {
    { 1, "a" }, // Record 1 to insert
    { 2, "b" }, // Record 2 to insert
    { 3, "c" }  // Record 3 to insert
});
batch(query, 
    new Object[] { 1, "a" }, // Record 1 to insert
    new Object[] { 2, "b" }, // Record 2 to insert
    new Object[] { 3, "c" }  // Record 3 to insert
);
batch(query,
    record1.intoArray(),
    record2.intoArray(),
    record3.intoArray()
);