为了账号安全,请及时绑定邮箱和手机立即绑定

varargs和“…”参数

varargs和“…”参数

潇潇雨雨 2019-12-15 16:04:59
考虑方法声明: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而发生错误。该大胆的顺序是真正的问题。这是第二个问题:是否一个...数组/参数有名字吗?
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

从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

  }

}



查看完整回答
反对 回复 2019-12-16
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

您可以只传递一个数组:


public void foo(String... args) {

}


String args[] = new String[10];

foo(args);



查看完整回答
反对 回复 2019-12-16
?
偶然的你

TA贡献1841条经验 获得超3个赞

您所描述的情况将非常罕见:大多数情况下,您的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@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

因此答案是,在模棱两可的情况下,它会将您通过的内容视为数组,而不是创建用于包装它的新数组。这是有道理的,因为如果您需要其他解释,可以始终将其包装在数组中。



查看完整回答
反对 回复 2019-12-16
  • 3 回答
  • 0 关注
  • 281 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信