下面先看一下代碼:
package com.eric.news;
public class TestWrapper2 {
public void doSomething(double num) {
System.out.println("deal double");
}
public void doSomething(Integer num) {
System.out.println("deal integer");
}
public static void main(String[] args) {
int i = 2;
TestWrapper2 t = new TestWrapper2();
t.doSomething(i);
}
}
哪一個(gè)method會(huì)被調(diào)用?在Tiger之前的環(huán)境中,這個(gè)很容易判斷的,int會(huì)被擴(kuò)展成double并調(diào)用doSomething(double num)。然而,在Tiger的環(huán)境中,看起來(lái)好像會(huì)發(fā)生boxing,所以解析后被調(diào)用的會(huì)是doSomething(Integer num),但實(shí)際上并不是這樣的。
在Tiger中,因?yàn)橛行┑南拗疲詍ethod的解析是三個(gè)pass的過(guò)程:
1. 編譯器會(huì)試著不用任何的boxing,unboxing,或者啟用vararg來(lái)定位正確的method。這會(huì)找到根據(jù)Java 1.4的規(guī)則而會(huì)調(diào)用的任何method。
2. 如果第一個(gè)pass失敗了,編譯器會(huì)再度嘗試解析method,但這次會(huì)容許boxing與unboxing轉(zhuǎn)換。具有vararg的方法不在這次pass考慮范圍內(nèi)。
3. 如果第二個(gè)pass也失敗了,編譯器會(huì)做最后一次的嘗試,容許boxing與unboxing,且同時(shí)也考慮到vararg method。
這樣的規(guī)則可以確保維持與Tiger之前的環(huán)境的一致性。
所有結(jié)果是:
deal double
但如果修改代碼為:
package com.eric.news;
public class TestWrapper2 {
public void doSomething(Double num) {
System.out.println("deal double");
}
public void doSomething(Integer num) {
System.out.println("deal integer");
}
public static void main(String[] args) {
int i = 2;
TestWrapper2 t = new TestWrapper2();
t.doSomething(i);
}
}
而這里就第一個(gè)pass就會(huì)失敗,而后繼續(xù)執(zhí)行第二個(gè)pass,所有結(jié)果為:
deal integer
posted on 2008-04-23 15:17
周銳 閱讀(318)
評(píng)論(0) 編輯 收藏 所屬分類:
Java