Порядок типов с перегруженными методами в Java

Даны два метода для одного и того же класса в Java:

public void doSomething( Person person );
public void doSomething( Employee employee );

где

Employee extends Person

Если я позвоню:

doSomething( employee )

Я нахожу этоdoSomething( Person ) вызывается.

Я ожидал, что будет вызвана перегрузка с самым близким совпадающим контрактом, а не с самым абстрактным (что я и обнаружил)

Может кто-нибудь объяснить, почему?

Ответы на вопрос(4)

employee объявили? Если это было объявлено какPerson employee = new Employee();, затемdoSomething(Person) действительно самая близкая совпадающая перегрузка.

В отличие от переопределений, перегрузки определяются во время компиляции. Поэтому, хотя тип времени выполненияemployee являетсяEmployee,Person перегрузка уже выбрана для выполнения.

УвидетьJLS & # xA7; 8.4.9 Перегрузка:

When a method is invoked (§15.12), the number of actual arguments (and any explicit type arguments) and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked (§15.12.2). If the method that is to be invoked is an instance method, the actual method to be invoked will be determined at run time, using dynamic method lookup (§15.12.4).

ей сигнатурой. Я подозреваю, что вашemployee этоPerson переменная. Таким образом, при вызове метода, ссылочный типemployee вызывает вашdoSomething(Person person) чтобы быть выбранным.

Решение Вопроса

но эта перегрузка определяется приcompileвремя, основанное на типе времени компиляцииemployee переменная.

Другими словами:

Employee employee = new Employee();
doSomething(employee); // Calls doSomething(Employee)

но:

Person employee = new Employee();
doSomething(employee); // Calls doSomething(Person)

Обратите внимание, что это не такoverriding где этоexecution time тип целевого объекта, который важен.

 02 июл. 2009 г., 18:20
Нечестно, я победил вас обоих (хотя я должен признать, что моя первая версия не была чрезвычайно полезной).
 02 июл. 2009 г., 18:15
Парень, ты быстрый, Джон, во второй раз ты меня сегодня отвечаешь :)
 02 июл. 2009 г., 18:43
То, как отвечает Джон, похоже на чтение справочного руководства - полное, краткое, по существу. Чувак, этот парень меня бесит. :)

а не во время выполнения, так что если у вас было

Person employee = new Employee();
doSomething(employee);

Это вызвало бы doSomething (Person), поскольку объявленным типом является Person, независимо от того, является ли экземпляр экземпляром Employee.

Ваш ответ на вопрос