下面先看一下代碼:
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);
}
}
哪一個method會被調用?在Tiger之前的環境中,這個很容易判斷的,int會被擴展成double并調用doSomething(double num)。然而,在Tiger的環境中,看起來好像會發生boxing,所以解析后被調用的會是doSomething(Integer num),但實際上并不是這樣的。
在Tiger中,因為有些的限制,所以method的解析是三個pass的過程:
1. 編譯器會試著不用任何的boxing,unboxing,或者啟用vararg來定位正確的method。這會找到根據Java 1.4的規則而會調用的任何method。
2. 如果第一個pass失敗了,編譯器會再度嘗試解析method,但這次會容許boxing與unboxing轉換。具有vararg的方法不在這次pass考慮范圍內。
3. 如果第二個pass也失敗了,編譯器會做最后一次的嘗試,容許boxing與unboxing,且同時也考慮到vararg method。
這樣的規則可以確保維持與Tiger之前的環境的一致性。
所有結果是:
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);
}
}
而這里就第一個pass就會失敗,而后繼續執行第二個pass,所有結果為:
deal integer
posted on 2008-04-23 15:17
周銳 閱讀(319)
評論(0) 編輯 收藏 所屬分類:
Java