可变参数列表

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();

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

原文地址:https://www.cnblogs.com/wjc920/p/9256173.html