在 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});
}
}
我对 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});
}
}