考虑方法声明:
String.format(String, Object ...)
Object ...
参数只是对Object
数组的引用。 有没有办法在引用实际的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。
粗体序列是真正的问题
这是第二个问题: ...
数组/参数是否有名称?
答案 0 :(得分:53)
决赛后的三个时期 参数的类型表示 最终参数可以作为一个传递 数组或作为参数序列。
所以你可以传递多个参数或数组。
以下工作正常:
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
}
}
答案 1 :(得分:11)
你可以传递一个数组:
public void foo(String... args) {
}
String args[] = new String[10];
foo(args);
答案 2 :(得分:8)
您所描述的情况将非常罕见:大多数情况下,您的varargs项目将是String
s,或数字,或Widget
s ...这将是不寻常的它们是Object
s(可能是任何东西)或数组。
但是如果varargs参数是一堆Object
s或数组类型,那么你的问题确实出现了:你可以将它传递给一个数组,然后编译器将如何知道你是想传递一个数组(你提供的数组),还是一系列应该为你输入数组的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
所以答案是,在模棱两可的情况下,它会将您传递的内容视为数组,而不是创建一个新数组来包装它。这是有道理的,因为如果你想要另一种解释,你可以自己将它自己包装在一个数组中。