如果我們重載可變參數列表,乍一看會覺得很安全。但是卻存在着隱患:如果不傳入參數,那麼編譯器就不知道要調用哪一個參數列表了,例如:
static void f(Character...args) {
for(Character c:args) {
System.out.println(c);
}
}
static void f(Integer...args) {
for(Integer c:args) {
System.out.println(c);
}
}
static void f(Double...args) {
for(Double c:args) {
System.out.println(c);
}
}
static void f(Long...args) {
for(Long c:args) {
System.out.println(c);
}
}
public static void main(String[] args) {
f('1','a');
f(1);
f(1,2);
f(0.0D);
f(0L);
//如果我們傳入一個空的參數,編譯器就無法知道應該調用哪一個方法了。儘管這個方法可以弄清楚,但是它可能會使客戶端程序員大感意外。
//f();
}
我們可能會使用添加一個可變參數來解決問題:
static void f(float q,Character...args) {
for(Character c:args) {
System.out.println(c);
}
}
static void f(Integer...args) {
for(Integer c:args) {
System.out.println(c);
}
}
但是還是會出現問題,如果給兩個方法都添加一個非可變參數(不同類型的),就可以解決問題了。
static void f(float q,Character...args) {
for(Character c:args) {
System.out.println(c);
}
}
static void f(char q,Integer...args) {
for(Integer c:args) {
System.out.println(c);
}
}
總結: 你應該只是在重載方法的一個版本上使用可變參數列表,或者壓根就不使用它!!