和其他编程语言一样,当方法的形参个数不确定时,Java 语言也提供一种可变参数列表。具体如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public class NewVarArgs { static void printArray(Object... args) { for(Object obj : args) { System.out.print(obj + " "); } System.out.println(); }
static void printStr(String... args) { for(String str : args) System.out.print(str + " "); System.out.println(); }
static void printInt(int... args) { for(int i : args) { System.out.print(i + " "); } System.out.println(); }
public static void main(String[] args) { printArray(new Integer(47), new Float(3.15), new Double(11.11)); printArray(47,3.15F,11.11); printArray("one", "two", "three");
printArray((Object[])new Integer[]{1, 2, 3, 4}); printArray();
printStr("I","am"); printStr("Sillywa");
printInt(1,2); printInt(1,2,3); }
}
|
当函数参数指定了一种类型之后,无论是传入该类型的包装类型还是基本类型,该函数都可以正常工作。
同样可变参数也会发生函数重载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class OverLoadingVarargs {
static void f(String... args) { System.out.print("first: "); for(String str : args) System.out.print(str + " "); System.out.println(); }
static void f(int... args) { System.out.print("second: "); for(int i : args) { System.out.print(i + " "); } System.out.println(); }
public static void main(String[] args) { f("I", "am", "Sillywa"); f(1,2,3); f(); } }
|
当发生函数重载时,编译器会自动匹配应该调用的方法,匹配规则与传入的形参有关,所以当不传入参数时,编译器就无法匹配正确的方法,因而报错。
因此我们可能会想到添加一个非可变参数类解决问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class OverLoadingVarargs { static void f(float i, Character... args) { System.out.println("first"); } static void f(Character... args) { System.out.println("second"); } public static void main(String[] args) { f(1,'a'); f('a','b'); } }
|
但是这样依然会报错,如果给这两个函数都添加一个非可变参数,问题就得以解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class OverLoadingVarargs { static void f(float i, Character... args) { System.out.println("first"); } static void f(char c, Character... args) { System.out.println("second"); } public static void main(String[] args) { f(1,'a'); f('a','b'); } }
|