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

时间:2018-08-17 12:15:51

标签: java methods arguments variable-length

假设我有如下方法:

  <toolchain>
    <type>jdk</type>
    <provides>
      <version>1.8</version>
      <vendor>oracle</vendor>
    </provides>
    <configuration>
      <jdkHome>C:\Program Files\Java\jdk1.8.0_172</jdkHome>
    </configuration>
  </toolchain>

如何创建上述方法的特殊版本,使其对public void setTask(String... args) { //... } 的第一个成员具有固定值,如下所示?

({args始终具有固定值 args[0]。)

constructorArgs.length == args.length-1
  

'setTask(java.lang.String ...)'无法应用于'(java.lang.String,java.lang.String [])'

2 个答案:

答案 0 :(得分:1)

您可以声明一个新的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);
}

答案 1 :(得分:1)

数组具有固定的结构。这意味着您一旦实例化就无法扩展(或减小)其大小。
因此,要满足您的要求,您必须创建一个具有所需容量的新阵列。

作为一种替代方法(虽然不是最有效的方法)(可以使用较小的列表),将数组转换为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);