当用Object [] param调用时,是不是接受vararg对象的函数...参数ambigous?

时间:2015-03-09 19:20:50

标签: java variadic-functions

所以基本上从我在StackOverflow上的搜索中,弹出(如果错误则纠正我):

  1. 您可以通过以下方式定义接受变量参数(在本例中为任何Object)的函数:

    public void varadric(Object... arguments) {
        //I'm a dummy function
    }
    
  2. 您可以使用任何参数计数(扩展Object)调用此方法,并且您将在函数中获得一个参数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);
    }
    
  4. 现在我的问题是:由于Object[]也实现了Object,这是否意味着无法在varargs中传递它(最后是嵌套数组?)?

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

     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
     }
    

    有人可以为我说清楚吗?

2 个答案:

答案 0 :(得分:2)

嗯,有几个选择:

  • 自己创建一个数组:

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

    Object tmp = array;
    varadric(tmp);
    
  • 以上变化 - 只是演员:

    varadric((Object) array);
    

但是,是的,您说得对,当提出类型为Object[]的单个参数且声明为Object... foo的varargs参数时,编译器赢得了&#t; t 将它包装起来,因为它在一个数组中,因为它不需要。

答案 1 :(得分:1)

它将是一个2D数组。 此声明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