И в Python 2.6 вперед:
import itertools
itertools.permutations([1,2,3])
(возвратился как генератор. Используйте list(permutations(l))
для возврата как список.)
Используется наиболее конкретная применимая перегрузка, но эта перегрузка определяется во время компиляции -время на основе типа времени компиляции переменной employee
.
Другими словами:
Employee employee = new Employee();
doSomething(employee); // Calls doSomething(Employee)
но:
Person employee = new Employee();
doSomething(employee); // Calls doSomething(Person)
Обратите внимание, что это не похоже на переопределение , где важен тип времени выполнения целевого объекта.
] При вызове перегруженного метода будет вызван метод с наиболее подходящей подписью. Я подозреваю, что ваш сотрудник
является переменной Person
. Таким образом, при вызове метода ссылочный тип сотрудника
заставляет ваш doSomething (Person person)
быть выбранным.
Выбор метода выполняется во время компиляции, а не во время выполнения, поэтому, если бы у вас был
Person employee = new Employee();
doSomething(employee);
, это вызвало бы doSomething (Person), поскольку объявленный тип - Person, независимо от того, является ли экземпляр также Сотрудник.
Как был объявлен сотрудник
? Если он был объявлен как Person employee = new Employee ();
, то doSomething (Person)
действительно является наиболее подходящей перегрузкой.
В отличие от переопределений, перегрузки определяются во время компиляции . Следовательно, даже несмотря на то, что тип среды выполнения сотрудника
- Сотрудник
, перегрузка Person
уже выбрана для выполнения.
См. JLS §8.4.9 Перегрузка :
Когда метод вызывается (§15.12) , количество фактических аргументов (и любых явных аргументов типа) и типы аргументов во время компиляции используются во время компиляции для определения сигнатуры вызываемого метода (§15.12.2) . Если метод, который должен быть вызван, является методом экземпляра, фактический метод, который должен быть вызван, будет определен во время выполнения с использованием динамического поиска метода (§15.12.4) .