为什么我们不能只使用数组而不是varargs?

Sai*_*S.R 10 java arrays android variadic-functions

我只是在varargs学习android(doInBackground(Type... params))时遇到过,SO帖子澄清了它的用法

我的问题是为什么我们不能只使用数组代替 varargs

public void foo(String...strings) {  }
Run Code Online (Sandbox Code Playgroud)

我可以通过在数组中包装我的可变数量的参数并将其传递给像这样的方法来替换这种类型的调用

public void foo(String[] alternativeWay){  }
Run Code Online (Sandbox Code Playgroud)

也不会main(String[] args)在Java中使用varargs,如果不是我们如何能够通过运行参数,它

请建议好处或使用,varargs是否还有其他重要的事项需要了解varargs

Jon*_*eet 14

唯一的区别

foo(String... strings)
Run Code Online (Sandbox Code Playgroud)

foo(String[] strings)
Run Code Online (Sandbox Code Playgroud)

用于调用代码.考虑这个电话:

foo("a", "b");
Run Code Online (Sandbox Code Playgroud)

这对于第一个声明是有效的foo,并且编译器将发出代码以创建包含对执行时"a""b"执行时的引用的数组.这是不是与第二个声明有效foo,但因为不使用可变参数.

在任何一种情况下,调用者都可以显式创建数组:

for(new String[] { "a", "b" }); // Valid for either declaration
Run Code Online (Sandbox Code Playgroud)

java中的main(String [] args)也使用varargs,如果不是,我们如何能够将运行时参数传递给它

什么时候写的main(String[] args)不是; 如果你写,main(String... args)那么它.这与JVM如何处理它无关,因为JVM初始化使用命令行参数创建一个数组.如果您编写自己的代码以main明确调用,那只会产生影响.


Hoo*_*pje 5

我们可以使用数组代替varargs。Varargs是使用数组的语法糖。但是它们使您的代码更紧凑,更易读。比较

private void foo(String... ss) { ... }

private void bar() {
    ...
    foo("One", "Two", "Three");
    ...
}
Run Code Online (Sandbox Code Playgroud)

private void foo(String[] ss) { ... }

private bar() {
    ...
    foo(new String[] { "One", "Two", "Three" });
    ...
}
Run Code Online (Sandbox Code Playgroud)

同样,我们也不需要菱形运算符(<>,Java 7)或lambdas(Java 8)。但是它们确实使代码更具可读性,因此更易于维护。