可变参数列表

来源:互联网 发布:顺义握奇数据怎么样 编辑:程序博客网 时间:2024/05/29 19:41
package variablearglist.one;public class Main {    public static void variablearglist(Object... os){        System.out.print("[");        for (Object i : os) {            System.out.print(i + ",");        }        System.out.println("]");    }//  public static void variablearglist(int... is) {//      System.out.print("[");//      for (int i : is) {//          System.out.print(i + ",");//      }//      System.out.println("]");//  }    public static void main(String[] args) {        System.out.println("多参数输出:");        variablearglist(1,2,3,4,5);        int[] intArray=new int[]{1,2,3,4,5};        System.out.println("基本类型数组输出:");        variablearglist(intArray);        Integer[] intObjArray=new Integer[]{                new Integer(0),new Integer(1),new Integer(2)        };        System.out.println("包装类型数组输出:");        variablearglist(intObjArray);        /*         * Output:         * 多参数输出:         * [1,2,3,4,5,]         * 基本类型数组输出:         * [[I@24065c4,]         * 包装类型数组输出:         * [0,1,2,]         */    }}

注:如果参数列表是Object… os且输入是多参数列表,则编译器会将多个基本类型元素包装为相应包装类数组(见 多参数输出),再传参;如果参数列表是Object… os且输入是基本类型数组(见 基本类型数组输出),则编译器无法转换,会将整个数组看成一个参数传入;如果参数列表是Object… os且输入是引用类型数组,则直接传参(见 包装类型数组输出)。

package variablearglist.one;public class Main {//  public static void variablearglist(Object... os){//      System.out.print("[");//      for (Object i : os) {//          System.out.print(i + ",");//      }//      System.out.println("]");//  }    public static void variablearglist(int... is) {        System.out.print("[");        for (int i : is) {            System.out.print(i + ",");        }        System.out.println("]");    }    public static void main(String[] args) {        System.out.println("多参数输出:");        variablearglist(1,2,3,4,5);        int[] intArray=new int[]{1,2,3,4,5};        System.out.println("基本类型数组输出:");        variablearglist(intArray);//      Integer[] intObjArray=new Integer[]{//              new Integer(0),new Integer(1),new Integer(2)//      };//      System.out.println("包装类型数组输出:");//      variablearglist(intObjArray);        /*         * Output:         * 多参数输出:         * [1,2,3,4,5,]         * 基本类型数组输出:         * [1,2,3,4,5,]         */    }}

注:如果参数列表是int… is且输入是多参数列表,则编译器会将多个基本类型元素包装为相应基本类型数组(见 多参数输出),再传参;如果参数列表是int… is且输入是基本类型数组(见 基本类型数组输出),则直接传参;同第一段代码对比,若输入类型为基本类型数组时,可变参数列表必须为对应基本类型加…若为Object…则编译器会将输入的基本类型数组看为一个元素传参。

package variablearglist.one;public class Main {    public static void variablearglist(Object... os){        System.out.print("[");        for (Object i : os) {            System.out.print(i + ",");        }        System.out.println("]");    }    public static void variablearglist(int... is) {        System.out.print("[");        for (int i : is) {            System.out.print(i + ",");        }        System.out.println("]");    }    public static void main(String[] args) {        System.out.println("多参数输出:");        variablearglist(1,2,3,4,5);//The method variablearglist(Object[]) is ambiguous for the type Main        int[] intArray=new int[]{1,2,3,4,5};        System.out.println("基本类型数组输出:");        variablearglist();//The method variablearglist(Object[]) is ambiguous for the type Main    }}

注:下面两行代码:

variablearglist(1,2,3,4,5);variablearglist();

会有编译错误,编译器无法区分,调用的是哪一个方法。其中,第二行代码编译错误可以通过定义一个无参重载方法来解决。可变参数列表尽量少用(容易混淆,且方法的参数列表不够清晰,则会导致重载方法变得复杂)。

0 0
原创粉丝点击