varargs和“…”参数

考虑方法声明:


String.format(String, Object ...)

该Object ...参数只是对Objects 数组的引用。有没有办法在引用实际Object数组时使用此方法?如果我将Object数组传递给...参数-生成的参数值将是二维数组-因为an Object[]本身就是an 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而发生错误。


该大胆的顺序是真正的问题。

这是第二个问题:是否一个...数组/参数有名字吗?


潇潇雨雨
浏览 282回答 3
3回答

繁华开满天机

从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  }}

繁星淼淼

您可以只传递一个数组:public void foo(String... args) {}String args[] = new String[10];foo(args);

偶然的你

您所描述的情况将非常罕见:大多数情况下,您的varargs项将是Strings,或数字或Widgets ...对于它们来说,它们Object通常是s(可以是任何东西)或数组是不寻常的。但是,如果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);    }}执行的结果(您的确切数字会有所不同:object1 = java.lang.Object@3e25a5array1 = [Ljava.lang.Object;@19821fThe array was [Ljava.lang.Object;@addbf1The array was [Ljava.lang.Object;@42e816The array was [Ljava.lang.Object;@19821fThe array was [Ljava.lang.Object;@9304b1因此答案是,在模棱两可的情况下,它会将您通过的内容视为数组,而不是创建用于包装它的新数组。这是有道理的,因为如果您需要其他解释,可以始终将其包装在数组中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java