varargs和“…”参数

btxsgosb  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(263)

考虑方法声明:

String.format(String, Object ...)

这个 Object ... 参数只是对 Object s。有没有办法用这个方法来引用一个实际的 Object 阵列?如果我通过 Object 数组到 ... 参数-结果参数值是否为二维数组-因为 Object[] 它本身就是一个 Object :

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

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

[class.getName() + "@" + Integer.toHexString(hashCode())]

然后是一个错误,因为数组大小是1。
大胆的顺序才是真正的问题。
这是第二个问题:a ... 数组/参数有名称吗?

gwbalxhn

gwbalxhn1#

从varargs上的文档:
final参数类型后的三个句点表示final参数可以作为数组或参数序列传递。
因此可以传递多个参数或一个数组。
以下工作正常:

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
  }
}
5jdjgkvh

5jdjgkvh2#

您所描述的情况将是相当罕见的:大多数情况下,您的varargs项目将 String s、 或数字,或 Widget s、 。。。对他们来说 Object s(可以是任何东西)或数组。
但是如果varargs的论点是 Object 或数组类型,那么您的问题就出现了:您可以向它传递一个数组,然后编译器如何知道您是要传递一个数组(您提供的数组),还是一系列的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);
    }
}

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

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

所以答案是,在不明确的情况下,它将您传递的内容作为数组处理,而不是创建一个新数组来 Package 它。这是有意义的,因为如果您需要另一种解释,您可以自己将其 Package 在一个数组中。

pxq42qpu

pxq42qpu3#

你可以传递一个数组:

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

String args[] = new String[10];
foo(args);

相关问题