Метод Java Overload с унаследованным интерфейсом - PullRequest
4 голосов
/ 21 октября 2009

Я пытаюсь понять поведение 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);

Спасибо

Ответы [ 3 ]

14 голосов
/ 21 октября 2009

Поскольку компилятор знает только, что a является экземпляром IA. Перегрузки определяются во время компиляции на основе типов времени компиляции задействованных выражений, а тип времени компиляции a равен IA.

(Сравните это с переопределением, когда реализация метода выбирается при выполнении времени на основе фактического задействованного типа.)

4 голосов
/ 21 октября 2009

Линия

 IA a = new myClass();

определяет объект a как тип IA, и это все, что знает компилятор. Он не может предполагать, что a также является IB, поскольку вполне возможно, что это так:

 public class MyClass2 implements IA{}

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

, в этом случае a НЕ является IB, как в вашем примере. Таким образом, компилятор не делает никаких предположений о типе, кроме того, который вы предоставляете. Поэтому он должен вызывать метод, который принимает IA.

3 голосов
/ 21 октября 2009

Поскольку вы передаете «a», это аргумент IA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...