1. 程式人生 > >重載方法匹配算法

重載方法匹配算法

mda double load html import java method .html ase

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

重載方法匹配算法