Лямбда соответствует сигнатуре 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
метод или метод экземпляра.