我正在尝试理解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);
由于
答案 0 :(得分:14)
因为编译器只知道a
是IA
的实例。根据所涉及表达式的编译时类型,在编译时确定重载,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参数。