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

И в Python 2.6 вперед:

import itertools
itertools.permutations([1,2,3])

(возвратился как генератор. Используйте list(permutations(l)) для возврата как список.)

6
задан Mark Rotteveel 19 December 2018 в 16:12
поделиться

4 ответа

Используется наиболее конкретная применимая перегрузка, но эта перегрузка определяется во время компиляции -время на основе типа времени компиляции переменной employee .

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

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

но:

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

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

]
13
ответ дан 8 December 2019 в 14:45
поделиться

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

0
ответ дан 8 December 2019 в 14:45
поделиться

Выбор метода выполняется во время компиляции, а не во время выполнения, поэтому, если бы у вас был

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

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

0
ответ дан 8 December 2019 в 14:45
поделиться

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

В отличие от переопределений, перегрузки определяются во время компиляции . Следовательно, даже несмотря на то, что тип среды выполнения сотрудника - Сотрудник , перегрузка Person уже выбрана для выполнения.

См. JLS §8.4.9 Перегрузка :

Когда метод вызывается (§15.12) , количество фактических аргументов (и любых явных аргументов типа) и типы аргументов во время компиляции используются во время компиляции для определения сигнатуры вызываемого метода (§15.12.2) . Если метод, который должен быть вызван, является методом экземпляра, фактический метод, который должен быть вызван, будет определен во время выполнения с использованием динамического поиска метода (§15.12.4) .

3
ответ дан 8 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: