2009-10-21 99 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的方法。