varargs和'...'的论点

Mar*_*aux 47 java arrays parameters variadic-functions

考虑方法声明:

String.format(String, Object ...)
Run Code Online (Sandbox Code Playgroud)

Object ...参数只是对Objects 数组的引用.有没有办法使用此方法引用实际Object数组?如果我将Object数组传递给...参数 - 结果参数值是否为二维数组 - 因为a Object[]本身是Object:

Object[] params = ....; // Make the array (for example based on user-input)
String s = String.format("%S has %.2f euros", params);
Run Code Online (Sandbox Code Playgroud)

所以数组的第一个组件(在String.format方法中使用)将是一个数组,他将生成:

[class.getName() + "@" + Integer.toHexString(hashCode())] 
Run Code Online (Sandbox Code Playgroud)

然后是一个错误,因为数组大小是1.

大胆的顺序是真正的问题.
这是第二个问题:是否一个...数组/参数有名字吗?

Aym*_*ieh 53

来自varargs上文档:

最后一个参数类型之后的三个句点表示最终参数可以作为数组或参数序列传递.

所以你可以传递多个参数或数组.

以下工作正常:

class VarargTest {
  public static void main(String[] args) {
    Object[] params = {"x", 1.2345f};
    String s = String.format("%s is %.2f", params);
    System.out.println(s); // Output is: x is 1.23
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者做`method((Object)array)`,它会自动换行 (8认同)

cle*_*tus 10

你可以传递一个数组:

public void foo(String... args) {
}

String args[] = new String[10];
foo(args);
Run Code Online (Sandbox Code Playgroud)


mch*_*erm 8

你所描述的情况将是相当罕见的:大多数时候,你的varargs项目将是Strings,或数字,或者Widget......它们是不寻常Object的(可能是任何东西)或数组.

但是如果varargs参数一堆Objects或数组类型,那么你的问题就出现了:你可以将它传递给一个数组,然后编译器将如何知道你是否要传递一个数组(你提供的数组),或者一系列的1项应该为你投入阵列吗?

快速测试显示了答案:

public class TestClass {
    public static void main(String[] args) {
        Object anObject = new Object();
        Object[] anArray = new Object[] {anObject, anObject};
        System.out.println("object1 = " + anObject);
        System.out.println("array1 = " + anArray);
        takesArgs();
        takesArgs(anObject, anObject);
        takesArgs(anArray); // is this the same as array1?
        takesArgs(anArray, anArray);
    }

    public static void takesArgs(Object... stuff) {
        System.out.println("The array was " + stuff);
    }
}
Run Code Online (Sandbox Code Playgroud)

执行结果(您的确切数字会有所不同:

object1 = java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1
Run Code Online (Sandbox Code Playgroud)

所以答案是,在模棱两可的情况下,它会将您传递的内容视为数组,而不是创建一个新数组来包装它.这是有道理的,因为如果你想要其他解释,你总是可以自己将它包装在一个数组中.