具有继承接口的Java重载方法

时间:2009-10-21 14:51:37

标签: java inheritance interface overloading

我正在尝试理解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);

由于

3 个答案:

答案 0 :(得分:14)

因为编译器只知道aIA的实例。根据所涉及表达式的编译时类型,在编译时确定重载,a的编译时类型为IA

(将此与覆盖进行比较,根据所涉及的实际类型,在执行时选择方法实现。)

答案 1 :(得分:4)

该行

 IA a = new myClass();

将对象a定义为类型IA,这是编译器所知道的。它不能假设a也是IB,因为它完全可能是真的:

 public class MyClass2 implements IA{}

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

在这种情况下,a不是您的示例中的IB。因此,除了您提供的类型之外,编译器不会对类型进行任何假设。所以它必须调用接受IA的方法。

答案 2 :(得分:3)

因为您传递的是“a”,这是一个IA参数。