Kiva
Kiva

Reputation: 9353

Method overloading with interface in Java

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.

Upvotes: 4

Views: 2227

Answers (3)

StephenMeyer
StephenMeyer

Reputation: 196

Consider the following scenario:

    interface Animal { }

    class Dog implements Animal{ public void dogMethod() {} }

    class Cat implements Animal{ public void catMethod() {} }

    public class Test {
        public static void test (Animal a) { System.out.println("Animal"); }

        public static void test (Dog d) { System.out.println("Dog"); }

        public static void test (Cat c) { System.out.println("Cat"); }

        public static void main(String[] args) {
            Animal a = new Cat();
            Animal d = new Dog();

            test(a);
        }
    }

If test(a) printed "Cat" and not (correctly) "Animal" simply because it holds a reference to a Cat object then you would be able to call catMethod() on an Animal object, which doesnt make any sense. Java chooses the most applicable method based on the type not what the variable references.

Upvotes: 0

kosa
kosa

Reputation: 66637

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.

Upvotes: 6

Kevin Mangold
Kevin Mangold

Reputation: 1155

The variable a is of type I -- if you were to use A a = new A(); it would use the correct overloaded method.

Upvotes: 3

Related Questions