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
          主站蜘蛛池模板: 秭归县| 汽车| 丰都县| 栾城县| 尼木县| 古丈县| 桂平市| 杭锦后旗| 南丰县| 博罗县| 丹寨县| 搜索| 深泽县| 祥云县| 临潭县| 和政县| 宜良县| 江北区| 晋江市| 怀来县| 民丰县| 个旧市| 宁化县| 桓仁| 栖霞市| 岫岩| 商都县| 思南县| 方山县| 永善县| 新民市| 湘潭市| 文山县| 平凉市| 南平市| 武城县| 龙山县| 内黄县| 林州市| 阜宁县| 莲花县|