Reputation: 9353
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
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
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
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