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

由于

有帮助吗?

解决方案

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

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

其他提示

该行

 IA a = new myClass();

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

 public class MyClass2 implements IA{}

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

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

因为你传递的是“a”,所以这是一个IA争论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top