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 周銳 閱讀(327) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 上高县| 禄丰县| 莱州市| 华阴市| 六枝特区| 北海市| 澄迈县| 丽水市| 德惠市| 西昌市| 阿勒泰市| 辉南县| 六安市| 双牌县| 奉节县| 出国| 乌拉特中旗| 佛山市| 古丈县| 平阴县| 广灵县| 阳高县| 会宁县| 徐水县| 克东县| 辽宁省| 榆中县| 阳信县| 宜兰市| 喜德县| 芜湖县| 固安县| 湖南省| 交城县| 杂多县| 桐城市| 南岸区| 碌曲县| 万宁市| 榕江县| 弥勒县|