2009-10-21 85 views
4

我想了解java的行爲。使用這個接口:Java繼承接口的過載方法

public interface IA {} 
public interface IB extends IA {} 
public class myClass implements IB {} 

我超載這樣的方法:

public void method(IA a); 
public void method(IB b); 

當調用方法具有以下對象:

IA a = new myClass(); 
method(a); 

爲什麼Java的使用:

public void method(IA a); 

而不是

public void method(IB b); 

感謝

回答

14

因爲編譯器只知道aIA一個實例。重載是在編譯時根據所涉及表達式的編譯時類型確定的,編譯時類型aIA

(帶覆蓋,其中,所述方法實現被選擇在執行基於所涉及的實際類型時間比較此。)

+2

是的。 &@paul然後查看訪問者模式和Google Double dispatch以瞭解更多相關主題。 – alphazero 2009-10-21 14:57:32

4

IA a = new myClass(); 

所述對象的定義爲IA型,這是所有編譯器知道。它不能假定也是IB,因爲它是完全有可能這是真的:

其中
public class MyClass2 implements IA{} 

IA a = new MyClass2(); 
method(a); 

情況下,是不是IB作爲你的榜樣。因此,編譯器不會對您提供的類型以外的其他類型進行假設。所以它必須調用接受IA的方法。