Какой метод вызывается, когда допустимы множественные перегрузки? - PullRequest
3 голосов
/ 22 февраля 2011

Скажем, у вас есть интерфейс A и интерфейс B.Допустим, класс Sprite реализует оба интерфейса.

Допустим, есть еще один класс, у которого есть метод foo(A object), а также есть метод foo(B object).

Когда оба меня вызываютпередать экземпляр Sprite методу foo()?Если нет, что имеет приоритет?

Ответы [ 4 ]

8 голосов
/ 22 февраля 2011

При методе с перегрузкой (как используется здесь) вызываемый метод разрешается во время компиляции на основе (объявленного) типа переменной, содержащей Sprite.

Поскольку вызов метода неоднозначен, он не будет компилироваться, пока вы вручную не уменьшите ссылку, чтобы устранить неоднозначность.

4 голосов
/ 22 февраля 2011

Это неоднозначно. Вам нужно будет привести к одному из интерфейсов.

3 голосов
/ 22 февраля 2011
   interface A {}

   interface B {}

   class Sprite implements A,B {}

   class Test{
      void foo(A a){}
      void foo(B b){}

      void test(){
       Sprite s = new Sprite();
       foo(s); // <-- compile time error (The method foo(A) is ambiguous for the type Test)
      }
   }
0 голосов
/ 24 апреля 2013

Общий ответ требует нескольких страниц для объяснения; см. соответствующий раздел в спецификации языка .

В конкретном случае, который вы представляете, он просто не скомпилируется. Но в других случаях существуют правила, по которым компилятор может предпочесть одну перегрузку другой и разрешить конфликт.

Самое важное правило заключается в том, что, в общем случае, если один метод более специфичен , чем другие, этот метод выбирается. Метод A является более конкретным , чем метод B, если все возможные вызовы метода A также будут компилироваться при вызове метода B. Обычно это означает, что некоторые формальные параметры метода A подклассы из соответствующих формальных Параметр (ы) в методе B. Есть несколько случаев, когда это не будет применяться, например, когда потребуется автоматическая упаковка или другое «преобразование метода», чтобы аргумент соответствовал в противном случае «более конкретному» случаю. Подробности см. В спецификации.

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