Лямбда соответствует сигнатуре FunctionalInterface, но "нет". Как вы объясните, что аргумент передается на всех?

Я работаю над этим проектом в настоящее время. Это работает на удивление хорошо.

Тем не менее, после перечитывания README я начал задумываться о том, как документировать то, что меня беспокоит...

Чтобы процитировать пример и на мгновение забыть, что можно генерировать исключения, он гласит:

Files.list(somePath).map(Path::toRealPath).forEach(System.out::println)

ХОРОШО. Теперь метод Path вовлечен этот. Конечно, мы не передаем LinkOption,

Опять же: давайте на минутку забудем, что оно выдает любое исключение.

ручья .map() занимает Function в качестве аргумента. Этот интерфейс, для Function<T, R>, определяется как:

R apply(T t);

Но метод, который я использую, не принимает аргументов. На первый взгляд, это не соответствует Function, право? Кроме этого...

Это можно записать как:

path -> path.toRealPath()

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

Я хотел бы документировать это соответственно, и я что-то здесь упускаю.

Что мне не хватает?

1 ответ

Решение

Нестатические методы имеют приемник (this) объект как неявный первый аргумент. Следовательно, Class::nonStaticMethod имеет еще один аргумент, чем вы могли ожидать.

Раздел 15.13.1 спецификации языка Java, объявление метода во время компиляции:

  • Во-вторых, с учетом целевого типа функции с n параметрами определяется набор потенциально применимых методов:

    • Если выражение ссылки на метод имеет вид ReferenceType :: Идентификатор [TypeArguments], потенциально применимыми методами являются методы-члены типа для поиска, которые имеют подходящее имя (заданное идентификатором), доступность, арность (n или n-1) и аргумент аргумента типа (производный от [TypeArguments]), как указано в §15.12.2.1.

      Рассматриваются две разные арности, n и n-1, чтобы учесть возможность того, что эта форма относится либо к static метод или метод экземпляра.

Другие вопросы по тегам