繁体   English   中英

可以使用数组调用具有任意数量参数的方法吗?

[英]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参数,内部会发生什么?

我不能改变方法,它来自Method类。

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方法。

我的猜测是你只需要在那里获得一个参数。 第二个Object...参数基本上是可选的,因为空Array也是一个Array

方法中的第一个参数是Object类型,这意味着您可以传递任何东西,包括Object of Array

此外, Object...在内部变成了Object[]参数,它只是语法糖

这是一个小例子,可以帮助您了解这里发生的事情:

-> 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意味着零个或多个对象,因为整个数组被分配给第一个参数,所以第二个参数获得“零”对象。

在这种情况下,

objects-array赋给foo()的First Argument,它是: Object object

第二个参数“对象...对象”指的是零大小的数组,

所以,参考这个带有输出的例子可能会以更好的方式帮助你,

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM