posts - 431,  comments - 344,  trackbacks - 0
          下面先看一下代碼:

          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 周銳 閱讀(320) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 阿克| 隆子县| 罗平县| 牡丹江市| 湖北省| 嫩江县| 抚宁县| 玛曲县| 门源| 大洼县| 易门县| 米泉市| 五台县| 通化市| 平果县| 电白县| 永川市| 宁南县| 来凤县| 蓬莱市| 湖南省| 长海县| 冀州市| 淳化县| 新安县| 正蓝旗| 曲沃县| 五峰| 万山特区| 东平县| 耿马| 黄山市| 皋兰县| 怀宁县| 江川县| 陕西省| 哈巴河县| 河间市| 扶沟县| 恩施市| 宜章县|