在Java中使用接口重载方法

Kiv*_*iva 4 java overloading

我有一个我不理解Java中的重载的行为.

这是我的代码:

interface I {}

class A implements I {}

class B {
   public void test(I i) {}

   public void test (A a) {}
}
Run Code Online (Sandbox Code Playgroud)

当我拨打以下电话时:

 I a = new A();
 b.test(a);
Run Code Online (Sandbox Code Playgroud)

我认为被调用的方法可能是test(A)明显的test(I).

我不明白为什么.在运行时我的变量a是A偶然A继承I.

kos*_*osa 6

因为引用类型是I,尽管你有类型A的对象.

A =新A();

将调用方法 test (A a) {}

根据JLS第15章:

在编译时选择最具体的方法; 它的描述符确定在运行时实际执行的方法.