将可变长度参数传递给具有不同大小的可变长度参数

Pass variable-length-arguments to variable-length-arguments with different sizes

假设我有如下方法:

public void setTask(String... args) {
    //...
}

如何创建上述方法的特殊版本,使 args 的第一个成员具有固定值,如下所示?

(args[0]总是有固定值constructorArgs.length == args.length-1。)

public void setSpecialTask(String... constructorArgs) {
    setTask("SpecialTask", constructorArgs); // ERROR: 'setTask(java.lang.String...)' cannot be applied to '(java.lang.String, java.lang.String[])'
}

'setTask(java.lang.String...)' cannot be applied to '(java.lang.String, java.lang.String[])'

您可以声明一个新的 setTask(String, String...) 方法,也可以创建一个包含附加字符串的数组:

public void setSpecialTask(String... constructorArgs) {
  String[] args = new String[constructorArgs.length + 1);
  args[0] = "SpecialTask";
  System.arraycopy(constructorArgs, 0, args, 1, constructorArgs.length);

  setTask(args);
}

数组有固定的结构。这意味着您不能在实例化后扩展(或减小)它的大小。
因此,为了实现您的要求,您必须创建一个具有所需容量的新阵列。

作为替代方法(虽然不是最有效的方法(小列表很好)),将数组转换为 List,添加缺少的元素并将其转换回数组:

public void setSpecialTask(String... constructorArgs) {
    String[] array = Arrays.asList("SpecialTask", constructorArgs)
                           .toArray(new String[constructorArgs.length+1]);
    setTask(array);    
}

或者在Java 8 中既简单又高效(不需要任何中介List):

String[] array = Stream.of("SpecialTask", constructorArgs)
                       .toArray(String[]::new);
setTask("SpecialTask", array);