转发可变数量的参数,以通过椭圆运算符接受可变数量的参数

时间:2014-09-01 06:16:23

标签: java

简而言之,我有一个函数接受可变数量的参数和另一个函数也接受可变数量的参数,我需要转发方法中的所有变量参数加上一些额外的接受变量的第二个方法参数...

action1(new Filter1());
action2(new Filter1(), new Filter2());

public void action1(Object ... params){
    actionGeneric(new Action1(), params);
}

public void action2(Object ... params){
    actionGeneric(new Action2(), params);    
}

public void actionGeneric(Object ... params){
    for (Object param : params){
        if (param instanceof Action1){
            // works fine
        } else if (param instanceof Action2){
            // works fine
        } else if (param instanceof Filter1){
            // never gets here
        } else if (param instanceof Filter2){
            // never gets here
        }
    }
}

所以我的问题是,我应该如何在action1 / action2中转发这些参数,以便actionGeneric将它们视为Filter1 / Filter2实例而不是(我猜)数组类型?

2 个答案:

答案 0 :(得分:3)

action2()方法中,使用两个参数调用actionGeneric()方法:new Action2()params(后者是Object数组)。因此,从actionGeneric()方法的角度来看,一些参数的类型为Action2,但不是Filter1。我认为,解决方案是在将数组传递给actionGeneric()方法之前创建一个新数组,沿着... ...

Object[] newParams = new Object[params.length + 1];
newParams[0] = new Action1();
System.arraycopy(params, 0, newParams, 1, params.length);
actionGeneric(newParams);

答案 1 :(得分:1)

如果将单个数组传递给variable-argument方法,则将其视为变量参数。所以,创建一个像这样的新数组:

  Object[] newArray = new Object[params.length + 1];
  newArray[0] = new Action1();
  System.arraycopy(params, 0, newArray, 1, params.length);

  actionGeneric(newArray);