Java 从调用方法传递可变数量的参数

Java 从调用方法传递可变数量的参数,java,Java,假设我们有一个方法,该方法至少接收一个参数,并且可能接收0个或多个相同类型的参数: public void method(T p1, T... otherPs) 我们有一个调用它的方法,如下所示: public void callingMethod(T... params) 我们知道它至少有一个参数 是否可以从callingMethod调用method,使其看起来像这样 public void callingMethod(T... params){ [...] method

假设我们有一个方法,该方法至少接收一个参数,并且可能接收0个或多个相同类型的参数:

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));