在 Java 中使用 ... 参数

Use of ... parameters in Java

我对 java 中的...参数有疑问。这是代码示例

class Foo{

    private void m1(Object... params){
        //do something with params[0]
        //do something with params[1]
        //do something with params[2]
        //do something with params[3]
    }

    public void m2(Object... params){
        Object additionalParam = new Object();
        m1(additionalParam, params);
    }

}
class Example{

    public void main(String[] args){
        Foo f = new Foo();
        Object o1 = new Object();
        Object o2 = new Object();
        Object o3 = new Object();
        f.m2(o1, o2, o3);
    }
}

这样的东西行得通吗?我没有遇到编译器错误,但是在做类似的事情时,我在从 m1().

更改其中一个对象的值时遇到了问题

解决方案: 我以为阵列会被展平,但显然这不会发生。

class Foo{

    private void m1(Object... params){
        //do something with params[0]
        //do something with params[1][0]
        //do something with params[1][1]
        //do something with params[1][2]
    }

    public void m2(Object... params){
        Object additionalParam = new Object();
        m1(additionalParam, params);
    }

}
class Example{

    public void main(String[] args){
        Foo f = new Foo();
        Object o1 = new Object();
        Object o2 = new Object();
        Object o3 = new Object();
        f.m2(o1, o2, o3);
    }
}

感谢 Sibbo 的贡献。

(TYPE...NAME) 参数简单地说 "pass in an number of objects of type TYPE"。然后可以通过 NAME[x] 定期访问这些,其中 x 是您传入的对象的索引。

编辑:我回答的第二部分是错误的。抱歉造成任何混淆。

您正在向 m1 传递两个参数。一个是 Object (A),一个是 Object[] (B)。要访问 A,您可以使用 params[0],但要从 B 访问任何元素 i,您需要使用 params[1][i].

因此,如果您预计生成的数组将被展平,不,它不会。

如果您想更改存储在您在 main 方法中传递的数组中的值,就像您在第二个示例中所做的那样。如果您想做得很好,请使用适当的类型而不是 Object.

Varargs 参数被编译器视为数组。因此,您的示例必须如下所示:

class Foo{

    private void m1(Object... params){
        //do something
    }

    public void m2(Object... params){
        Object additionalParam = new Object();
        Object[] newArray = /* Here you need to create an array with all param elements and the new one*/
        m2(newArray);
    }

}
class Example{

    public int main(String[] args){
        Foo f = new Foo();
        Object o1 = new Object();
        Object o2 = new Object();
        Object o3 = new Object();
        f.m2(new Object[]{o1, o2, o3});
    }
}