java char 数组 作为形参_我可以将数组作为参数传递给Java中带有变量参数的方法吗?...

18bbc04e016dcfe773c9b9e3ed3c33dc.png

墨色风雨

是的,aT...只是一种语法糖。T[].JLS 8.4.1格式参数列表中的最后一个形式参数是特殊的;它可能是可变度参数,由类型后面的省略号指示。如果最后一个形式的参数是类型的变量性参数T,它被认为定义了一个类型的形式参数。T[]..然后,该方法是可变度方法。否则,它就是固定性方法。变量方法的调用可能包含比形式参数更多的实际参数表达式。所有与变量性参数之前的形式参数不对应的实际参数表达式都将被计算,并将结果存储到将传递给方法调用的数组中。这里有一个例子来说明:public static String ezFormat(Object... args) {

    String format = new String(new char[args.length])

        .replace("\0", "[ %s ]");

    return String.format(format, args);}public static void main(String... args) {

    System.out.println(ezFormat("A", "B", "C"));

    // prints "[ A ][ B ][ C ]"}是的,上面main方法是有效的,因为同样,String...只是String[]..而且,由于数组是协变的,所以String[]是Object[],所以你也可以打电话给ezFormat(args)不管怎样。另见Java语言指南/varargsVarargs抓到#1:传球null如何解决varargs是相当复杂的,有时它所做的事情可能会令你吃惊。考虑这个例子:static void count(Object... objs) {

    System.out.println(objs.length);}count(null, null, null); // prints "3"count(null, null); // prints "2"count(null); 

    // throws java.lang.NullPointerException!!!由于varargs是如何解析的,最后一条语句将调用objs = null,这当然会导致NullPointerException带着objs.length..如果你想给一个null参数为varargs参数时,可以执行以下任一操作:count(new Object[] { null }); // prints "1"count((Object) null); // prints "1"相关问题以下是人们在处理varargs时提出的一些问题的示例:有静脉曲张和超载?如何处理varargs和反射最具体的固定/可变度匹配方法(Varargs)Vararg Gochas#2:添加额外的参数正如您所发现的,以下内容“行不通”:    String[] myArgs = { "A", "B", "C" };

    System.out.println(ezFormat(myArgs, "Z"));

    // prints "[ [Ljava.lang.String;@13c5982 ][ Z ]"因为瓦拉格的工作方式,ezFormat实际上有两个参数,第一个参数是String[],第二个是String..如果要将数组传递给varargs,并且希望将其元素识别为单个参数,并且还需要添加额外的参数,那么除了创建另一个数组可以容纳额外的元素。下面是一些有用的帮助方法:static  T[] append(T[] arr, T lastElement) {

    final int N = arr.length;

    arr = java.util.Arrays.copyOf(arr, N+1);

    arr[N] = lastElement;

    return arr;}static  T[] prepend(T[] arr, T firstElement) {

    final int N = arr.length;

    arr = java.util.Arrays.copyOf(arr, N+1);

    System.arraycopy(arr, 0, arr, 1, N);

    arr[0] = firstElement;

    return arr;}现在您可以执行以下操作:    String[] myArgs = { "A", "B", "C" };

    System.out.println(ezFormat(append(myArgs, "Z")));

    // prints "[ A ][ B ][ C ][ Z ]"

    System.out.println(ezFormat(prepend(myArgs, "Z")));

    // prints "[ Z ][ A ][ B ][ C ]"Varargs抓到#3:传递一个原语数组它不“起作用”:    int[] myNumbers = { 1, 2, 3 };

    System.out.println(ezFormat(myNumbers));

    // prints "[ [I@13c5982 ]"Varargs只适用于引用类型。自动装箱不适用于原语数组。以下工作:    Integer[] myNumbers = { 1, 2, 3 };

    System.out.println(ezFormat(myNumbers));

    // prints "[ 1 ][ 2 ][ 3 ]"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值