有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将variablelengtharguments传递给不同大小的variablelengtharguments

假设我有一个如下的方法:

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[])'


共 (2) 个答案

  1. # 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);
    }
    
  2. # 2 楼答案

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

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