重載方法匹配算法
C++
http://en.cppreference.com/w/cpp/language/overload_resolution
Java
http://www.2cto.com/kf/201410/339676.html
(2.3.1的補充資料)泛讀
Java overload resolution——重載方法匹配算法如下:
(1)找出所有能夠調用的方法。能夠調用的方法意味著形參個數等於實參個數,實參的類型能夠轉換為方法形參的類型。
(2)如果實參與形參的類型能夠直接對應,則執行該方法。
(3)如果能夠調用的方法只有一個,則執行該方法。
(4)能夠調用的方法不止一個時,逐一作出判斷:如果一個方法的類型簽名都可以賦值給另一個方法,則後者(類型大者)被排除;重復此操作,直到無法排除為止。【the Most Specific Method】
(5)經過步驟(4),如果只剩下一個方法,則執行該方法;或者編譯器報錯。
但是,自動裝箱和變長參數會使問題更復雜(還有import static 因素,在下一節2.3.2)。所以,大致了解一下就可以了。
①首先不考慮自動裝箱和變長參數②再加上自動裝箱③再加上自動裝箱變長參數
例子1:有void m(Object )、void m(int[] )、m(int )方法,
Object obj = null;
m(obj);
按照(2)調用m(Object )
例子2:有void m(Object )、void m(int[] )、m(int )方法,
m(null);
按照(4),排除m(Object )後,調用void m(int[] )
例子3:有void m(Object )、void m(int[] )、m(String )方法,
m(null);
按照(4),排除m(Object )後,void m(int[] )和m(String )無法排除。按照(5),編譯報錯。
例子4:有void f(double,float )、void f(float , double )方法,
f(12 ,9);
按照(5),編譯報錯。
例子5:有void f(double,float )、void f(float , double )和void f(double ,int )
f(12 ,9);
按照(5),編譯報錯。f(double,float )- f(float , double )
例子6:有void f(double,float )、void f(float , double )和void f(float,int )方法,
f(12 ,9);
按照(4), 調用f(float , int)
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12
重載方法匹配算法