Method overloading with interface in Java

java, overloading

Solution

Because the reference type is of I eventhough you have object of type A.

A a = new A();

will invoke method `test (A a) {}`

As per JLS Chapter 15:

The most specific method is chosen at compile-time; its descriptor determines what method is actually executed at run-time.

Problem

I have a behaviour that I don't understand with overloading in Java. Here is my code: ``` interface I {} class A implements I {} class B { public void test(I i) {} public void test (A a) {} } ``` When I call the following line: ``` I a = new A(); b.test(a); ``` I thought the called method would be `test(A)` but visibly it's `test(I)`. I don't understand why. In runtime my variable `a` is a A even A inherits I.

Original source