2012-08-23 71 views
4

我有一種行爲,我不明白在Java中重載。使用Java中的接口重載方法

這裏是我的代碼:

interface I {} 

class A implements I {} 

class B { 
    public void test(I i) {} 

    public void test (A a) {} 
} 

當我調用下面一行:

I a = new A(); 
b.test(a); 

我想調用的方法是test(A)但明顯這是test(I)

我不明白爲什麼。在運行時我的變量a是甲甚至A繼承I.

+0

http://en.wikipedia.org/wiki/Multiple_dispatch –

+0

因爲這個決定是在編譯時完成的 - 並且在編譯時沒有辦法知道'a'是否是'A'或其他東西(例如它可能取決於用戶輸入)。可以肯定的是'a'將會是'I'。 – assylias

回答

6

由於參考類型是我雖然你們有類型A.

甲一個新= A()的對象;

將調用方法test (A a) {}

作爲每JLS第15章:

被選擇在編譯時最特異的方法;其描述符 確定在運行時實際執行的方法。

+0

我不能那樣做,否則我會這樣做。我已經減少了代碼,但是我從另一種方法中獲得了我的a,並且我無法更改它。 – Kiva

+1

你是一個叫b.test(a)的人;不是嗎?那麼爲什麼不把「a」的引用從I改爲A? – kosa

+0

我不知道運行時的「a」類型。我的方法給我一個我和我打電話的另一種方法。我想爲某些類做一些具體的事情,我不想做「如果instanceof {做那個} else if instanceof {做其他事情}」,所以我很糟糕,我可以通過重載來做到這一點。 – Kiva

3

變量aI類型的 - 如果你使用A a = new A();它會使用正確的重載方法。

0

考慮以下情形:

interface Animal { } 

    class Dog implements Animal{ public void dogMethod() {} } 

    class Cat implements Animal{ public void catMethod() {} } 

    public class Test { 
     public static void test (Animal a) { System.out.println("Animal"); } 

     public static void test (Dog d) { System.out.println("Dog"); } 

     public static void test (Cat c) { System.out.println("Cat"); } 

     public static void main(String[] args) { 
      Animal a = new Cat(); 
      Animal d = new Dog(); 

      test(a); 
     } 
    } 

若(a)印有「貓」,而不是(正確),「動物」,只是因爲它擁有一隻貓對象的引用,那麼你就能夠調用測試catMethod()在Animal對象上,這沒有任何意義。 Java根據類型選擇最適用的方法,而不是變量引用的方法。