将可变长度参数传递给具有不同大小的可变长度参数
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);
假设我有如下方法:
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);