import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
x(null);
}
public static void x(int x){
System.out.println("x(int)");
}
public static void x(List x){
System.out.println("x(List)");
}
public static void x(ArrayList x){
System.out.println("x(ArrayList)");
}
public static void x(Object x){
System.out.println("x(Object)");
}
}
先給段代碼,大家認爲會輸出什麼?
這個當然直接copy到編譯器就直接知道了,是x(ArrayList)
那麼爲什麼呢?
先說說重載的規則:
1. java編譯器在尋找最精確的匹配的方法,例如,max(3,4)調用的就是max(int ,int);max(3.0,4.0)調用的就是max(double,double);
2. 被重載的方法必須有不同的參數列表。不能基於不同修飾符或返回值類型來重載方法。例如public static int max(int num1,int num2)和private static int max (int num1,intnum2);
public static double max(int num1,int num2)和public static int max(int num1,intnum2)
有時候調用一個方法時,會有兩個或更多匹配的,會造成歧義調用(ambitious invocation)的編譯錯誤。即當編譯器找不到最準確的匹配方法時便會出現這個情況,比如:
public class test{
public static void main(String[] args){
System.out.println(max(1,2));
}
public static int max(int num1,double num2){
if(num1>num2)
return num1;
else
return num2;
}
public static int max(double num1,int num2){
if(num1>num2)
return num1;
else
return num2;
}
}
又比如,如果把這裏
public static void x(int x){
System.out.println("x(int)");
}
改成
public static void x(Integer x){
System.out.println("x(int)");
}
程序就會報錯!
因爲匹配有錯!Integer是引用類型,Integer對象是可以賦值爲null的,這個就和List/ArrayList衝突了
在原來程序裏面,int 是原生類型,Object是基本對象類型,所以,這兩個和List \ ArrayList不衝突,所以,不會報錯!
那麼爲什麼List和ArrayList不衝突呢?
Object ---> List ---> ArrayList是繼承關係。
在英語語法中,有一個有意思的原則,叫:就近原則 , Java的設計者在設計重載函數的衝在順序時,不應該忽視他,因爲這個原則很好的表達了繼承關係。
於是,根據這原則,List和ArrayList不會衝突,並且在這個代碼裏面int無法賦值爲null,所以自然選擇x(ArrayList)。