У меня есть следующий фрагмент кода, который использует функциональные интерфейсы 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
в функциональный интерфейс? Я что-то упускаю из виду? Или это какой-то угловой случай функциональных интерфейсов?