Java 从调用方法传递可变数量的参数
假设我们有一个方法,该方法至少接收一个参数,并且可能接收0个或多个相同类型的参数:Java 从调用方法传递可变数量的参数,java,Java,假设我们有一个方法,该方法至少接收一个参数,并且可能接收0个或多个相同类型的参数: public void method(T p1, T... otherPs) 我们有一个调用它的方法,如下所示: public void callingMethod(T... params) 我们知道它至少有一个参数 是否可以从callingMethod调用method,使其看起来像这样 public void callingMethod(T... params){ [...] method
public void method(T p1, T... otherPs)
我们有一个调用它的方法,如下所示:
public void callingMethod(T... params)
我们知道它至少有一个参数
是否可以从callingMethod
调用method
,使其看起来像这样
public void callingMethod(T... params){
[...]
method(params[0], restOfParams);
[...]
}
当然,这是可能的,而且非常简单。
唯一的开销是创建另一个数组。
请参见Eugene以了解内存消耗
有点离题,但我只是按照建议运行JOL,下面是空引用数组的输出
final String[] array = new String[0];
对于具有单个,
null
元素的数组
final String array = new String[1];
final String array = new String[1];
array[0] = new String("");
对于包含单个非空元素的数组
final String array = new String[1];
final String array = new String[1];
array[0] = new String("");
是的,至少在几个方面 因为Java中的varargs是传递数组的语法糖,yu可以创建一个包含其余参数的数组(可能使用),并将其作为第二个参数传递:
method(params[0], Arrays.copyOfRange(params, 1, params.length));
另一种方法是通过反射,但这里不需要。我不理解您的问题,但varargs中至少有一个参数不是必需的 此外,您还可以检查params.length!=0 然后打电话
方法(params[0],Arrays.copyOfRange(params,1,params.length)) 不是这样,您需要使用
Arrays::copyOfRange
在这种情况下,您可以更改方法的签名,以接受第二个参数作为类型列表。并使用该列表检索值。列表可以保存值0…n。无法更改“方法”的签名,只能更改“callingMethod”。参数的数量未知,它是在运行时生成的,所以我只知道至少会有一个。另外,创建新阵列可能会导致资源管理方面的问题。另外#2:由于同样的原因,不允许在顶部创建新方法。是否只允许另一个数组引用?这将创建一个全新的数组。@Eugene如果元素是引用,它们的指针将被简单地复制。一个数组至少有两个标头+大小,并且这些引用至少有12个字节,每个字节都是错误的计算。我建议你使用jol
来准确地知道它是什么-或者如果你不确定或猜测(反正与问题无关),就不要把它放在答案中。我会试试jol
的,但我很确定计算是正确的。不要只是抄袭别人的答案,这很粗鲁。@Cosmino抄袭的文本不是答案。对于输入来说,它的思考范围太窄,我在参考资料中遇到了两个数组的问题,所以反射是我在这一个中最不需要的:)@CosminO-:-)并且每当您不需要它时(您不在这里)。。。
[Ljava.lang.String;@7ea37dbfd object externals:
ADDRESS SIZE TYPE PATH VALUE
707612b68 16 [B [0].value []
707612b78 1577856 (something else) (somewhere else) (something else)
707793ef8 24 [Ljava.lang.String; [(object)]
707793f10 24 java.lang.String [0] (object)
method(params[0], Arrays.copyOfRange(params, 1, params.length));