我想调用签名为
的方法public void foo(Object object, Object ... objects) { }
我称之为
Object[] objects = ...;
foo(objects);
因为编译器没有抱怨它似乎有效,但是
签名中的第一个参数会发生什么?是objects[0]
任何人都可以解释Object ... objects
参数,内部会发生什么?
我无法更改方法,它来自Method类。
答案 0 :(得分:2)
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)的情况下调用它会更尴尬,或者您需要另一个只接受一个参数才能调用的方法no-arg方法。
答案 1 :(得分:1)
我猜你只是想在那里得到一个参数。第二个Object...
参数基本上是可选的,因为空Array
也是Array
。
您方法中的第一个参数类型为Object
,这意味着您可以传递任何内容,包括Array
Object
个
此外,Object...
内部变成了Object[]
参数,它只是语法糖
答案 2 :(得分:1)
这是一个小例子,可以帮助您了解此处发生的事情:
-> 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: []
如您所见,由于数组是对象,第一个参数将获得整个数组,而第二个参数获得零大小的数组。为什么一个空阵列?因为varargs意味着零或更多对象,因为整个数组被分配给第一个参数,所以第二个参数得到"零"对象
答案 3 :(得分:0)
在这种情况下,
objects-array赋给foo()的First Argument:对象
第二个论点"对象......对象"将其称为零大小 阵列,
所以,请参考这个例子,out out可能会帮助你更好 方式,
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