可以使用数组调用具有任意数量参数的方法吗?
Can a method with arbitrary number of arguments, be called with an array?
我想调用签名为
的方法
public void foo(Object object, Object ... objects) { }
我这样称呼它
Object[] objects = ...;
foo(objects);
因为编译器没有抱怨它似乎有效,但是
签名中的第一个参数会发生什么?是吗objects[0]
谁能解释一下 Object ... objects
参数,内部发生了什么?
我无法更改方法,它来自方法 class。
Varargs 实际上是一种描述数组的不同语法,所以原则上是的。但是由于您明确定义了第一个参数,因此您必须单独传递它。
vargs 的问题是您也无法传递任何参数,即长度为 0 的数组。这可能就是您要显式声明第一个参数的原因,IMO 没问题。你只是不能随心所欲地称呼它。
使用您的方法签名,以下应该有效:
foo("first");
foo("first", "second", "third");
foo("first", new String[]{"second", "third"} );
你定义的问题,即使用 Object
是数组也是对象,所以你上面描述的调用基本上就像 foo("first")
.
编辑:
因为你提到的方法是 Method.invoke(Object object, Object ... objects)
很明显为什么有 2 个参数。第一个是执行目标,即应该调用该方法的实例,而第二个是参数数组。
可以将该签名重写为 Method.invoke(Object object, Object[] objects)
但是在不首先创建数组(即使长度为 0)的情况下调用它会更尴尬,或者您需要另一种只接受一个参数的方法才能调用无参数方法。
我猜你只会在其中获取一个参数。第二个 Object...
参数基本上是可选的,因为一个空的 Array
也是一个 Array
.
您的方法中的第一个参数是 Object
类型,这意味着您可以传递任何内容,包括 Array
的 Object
s
此外,Object...
在内部变成了一个Object[]
参数,它只是语法糖
这里,对于你的情况,
objects-array 分配给 foo() 的第一个参数,即:Object object
And second Argument "Object ... objects" refer's as a zero-size
Array,
so, refer this example with out put might be help you in a more better
way,
public static void main(String[] a) {
Object[] objects = {
new Object() , new Object(), new Object()
};
foo(objects);
}
public static void foo(Object object, Object ... objects){
System.out.println(object.hashCode());
System.out.println("--------------");
System.out.println(objects.length);
for(Object o : objects){
System.out.println(o.hashCode());
}
}
输出:
848123013
--------------
0
这是一个小例子,可以帮助您理解这里发生的事情:
-> void foo(Object object, Object ... objects) {
>> System.out.println("First parameter: " + object);
>> System.out.println("Second parameter: " + Arrays.toString(objects));
>> }
>>
| Added method foo(Object,Object ...)
-> Object[] objects = new Object[]{"test1", "test2", "test3"}
| Added variable objects of type Object[] with initial value [Ljava.lang.Object;@ae45eb6
>>
-> foo(objects)
First parameter: [Ljava.lang.Object;@ae45eb6
Second parameter: []
如您所见,由于数组是对象,因此第一个参数将获取整个数组,而第二个参数将获取大小为零的数组。为什么是空数组?因为可变参数意味着 零 个或更多对象,由于整个数组被分配给第一个参数,第二个参数得到 "zero" 个对象。
我想调用签名为
的方法public void foo(Object object, Object ... objects) { }
我这样称呼它
Object[] objects = ...;
foo(objects);
因为编译器没有抱怨它似乎有效,但是
签名中的第一个参数会发生什么?是吗objects[0]
谁能解释一下 Object ... objects
参数,内部发生了什么?
我无法更改方法,它来自方法 class。
Varargs 实际上是一种描述数组的不同语法,所以原则上是的。但是由于您明确定义了第一个参数,因此您必须单独传递它。
vargs 的问题是您也无法传递任何参数,即长度为 0 的数组。这可能就是您要显式声明第一个参数的原因,IMO 没问题。你只是不能随心所欲地称呼它。
使用您的方法签名,以下应该有效:
foo("first");
foo("first", "second", "third");
foo("first", new String[]{"second", "third"} );
你定义的问题,即使用 Object
是数组也是对象,所以你上面描述的调用基本上就像 foo("first")
.
编辑:
因为你提到的方法是 Method.invoke(Object object, Object ... objects)
很明显为什么有 2 个参数。第一个是执行目标,即应该调用该方法的实例,而第二个是参数数组。
可以将该签名重写为 Method.invoke(Object object, Object[] objects)
但是在不首先创建数组(即使长度为 0)的情况下调用它会更尴尬,或者您需要另一种只接受一个参数的方法才能调用无参数方法。
我猜你只会在其中获取一个参数。第二个 Object...
参数基本上是可选的,因为一个空的 Array
也是一个 Array
.
您的方法中的第一个参数是 Object
类型,这意味着您可以传递任何内容,包括 Array
的 Object
s
此外,Object...
在内部变成了一个Object[]
参数,它只是语法糖
这里,对于你的情况,
objects-array 分配给 foo() 的第一个参数,即:Object object
And second Argument "Object ... objects" refer's as a zero-size Array,
so, refer this example with out put might be help you in a more better way,
public static void main(String[] a) {
Object[] objects = {
new Object() , new Object(), new Object()
};
foo(objects);
}
public static void foo(Object object, Object ... objects){
System.out.println(object.hashCode());
System.out.println("--------------");
System.out.println(objects.length);
for(Object o : objects){
System.out.println(o.hashCode());
}
}
输出:
848123013
--------------
0
这是一个小例子,可以帮助您理解这里发生的事情:
-> void foo(Object object, Object ... objects) {
>> System.out.println("First parameter: " + object);
>> System.out.println("Second parameter: " + Arrays.toString(objects));
>> }
>>
| Added method foo(Object,Object ...)
-> Object[] objects = new Object[]{"test1", "test2", "test3"}
| Added variable objects of type Object[] with initial value [Ljava.lang.Object;@ae45eb6
>>
-> foo(objects)
First parameter: [Ljava.lang.Object;@ae45eb6
Second parameter: []
如您所见,由于数组是对象,因此第一个参数将获取整个数组,而第二个参数将获取大小为零的数组。为什么是空数组?因为可变参数意味着 零 个或更多对象,由于整个数组被分配给第一个参数,第二个参数得到 "zero" 个对象。