У меня есть следующий фрагмент кода, который использует функциональные интерфейсы Java, который компилируется, но не ясно, почему он компилируется:
public class App {
public static void main(String[] args) throws Exception {
final RecordIterator it = new RecordIterator<MyRecord>();
final UpdateManager updateManager = new UpdateManager();
updateManager.doUpdateForEach(it, DatabaseOperator::updateInfo);
}
}
class UpdateManager {
public void doUpdateForEach(final RecordIterator recordIterator,
final FunctionalStuff<MyRecord> updateAction) throws Exception {
updateAction.execute(new DatabaseOperator(), new MyRecord());
}
}
class RecordIterator<E> {
}
@FunctionalInterface
interface FunctionalStuff<T> {
void execute(final DatabaseOperator database, final T iterator) throws Exception;
}
class DatabaseOperator {
public void updateInfo(final MyRecord r) {
}
}
class MyRecord {
}
Итак, моя путаница внутри main метода:
- последняя строка основного метода -
updateManager.doUpdateForEach(it, DatabaseOperator::updateInfo); - метод
UpdateManager#doUpdateForEachожидаетRecordIterator(хорошо, имеет смысл) иFunctionalStuff -
FunctionalStuffимеет единственный метод (очевидно), который получает 2 параметра - Второй аргумент
doUpdateForEach- это ссылка на метод (DatabaseOperator::updateInfo) - Метод
DatabaseOperator::updateInfoполучает один аргумент
как это компилируется? Как преобразовать ссылку на метод DatabaseOperator::updateInfo в функциональный интерфейс? Я что-то упускаю из виду? Или это какой-то угловой случай функциональных интерфейсов?