当使用 Object[] 参数调用时,接受 vararg Object... 参数的函数不是模棱两可的吗?

Isn't function that accepts vararg Object... argument ambigous when called with Object[] param?

所以基本上从我在 Whosebug 上的搜索中,弹出了这个(如果错误请纠正我):

  1. 您可以这样定义接受可变参数(在本例中为任何对象)的函数:

    public void varadric(Object... arguments) {
        //I'm a dummy function
    }
    
  2. 您可以使用任意数量的参数(扩展对象)调用此方法,您将在函数中得到一个参数 Object[]

     public static main() {
         varadric("STRING", new ArrayList<int>());
     }
     public void varadric(Object... arguments) {
         System.out.println("I've received "+arguments.length+" arguments of any Object subclass type.");
     }
    
  3. 你可以用某种方式 generate the input as Object[] array and pass as a single parameter 而不做任何改变:

    public static main() {
        Object[] args = new Object[2];
        args[0] = "STRING";
        args[1] = new ArrayList<int>());
        //Should say it got 2 arguments again!
        varadric(args);
    }
    

现在我的问题是:既然 Object[] 也实现了 Object,这是否意味着它不能在可变参数中传递(以嵌套数组结尾?)?

想象以下具有更具体描述的场景:

 public void varadric(Object[]... arguments) {
      //I'm a function that expects array of arrays
      // - but I'm not sure if I'll allways get that
 }

有人能帮我说清楚吗?

嗯,有几个选项:

  • 自己创建数组:

    varadric(new Object[] { array })
    
  • 声明一个 Object 类型的局部变量并让编译器将 that 包装在一个数组中:

    Object tmp = array;
    varadric(tmp);
    
  • 上述的变体 - 只需施放:

    varadric((Object) array);
    

但是,是的,您说得对,当出现 Object[] 类型的单个参数和声明为 Object... foo 的可变参数时,编译器 不会 将它包装起来,因为它不需要包装在一个数组中。

这将是一个二维数组。 此声明 public void varadric(Object[]... arguments) 将接收 Object[] 的数组 (...) 示例:

public class Test {
    public static void main(String[] args) {
        Object[] o = new Object[2]; 
        o[1] = "hi";
        t(o);
    }

    public static void t(Object[]... arg) {
        System.out.println(arg[0][1]);
    }
}

将打印: hi