#java
#java
Вопрос:
Как работает следующее? Я передаю a Supplier
там, где Function
ожидается a .
class Scratch {
private Bar bar = new Bar("foo");
public static void main(String[] args) {
Scratch scratch = new Scratch();
System.out.println(scratch.getBarValue(Bar::getValue));
}
public <T> T getBarValue(Function<Bar, T> extractor) {
return extractor.apply(bar);
}
static class Bar {
private String value;
Bar(String value) {
this.value = value;
}
String getValue() {
return value;
}
}
}
Я понимаю, что Java создает функцию от поставщика, но, как ни странно, не может найти никакой документации по этому поводу.
Ответ №1:
getValue()
кажется, не принимает аргументов, но на самом деле имеет неявный this
параметр.
Обычно это скрывается за синтаксическим сахаром object.method(...)
. Однако, когда вы создаете ссылку на метод с ::
помощью, неявное this
становится явным. getValue()
затем обрабатывается как функция с одним аргументом, поскольку она может быть вызвана только в том случае, если она знает, для чего Bar
она вызывается.
Это происходит с любым методом экземпляра. Это не относится к static
методам; у них нет this
.
Ответ №2:
Bar::getValue
это функция, которая принимает Bar
экземпляр и возвращает строку. Это не поставщик, потому что без Bar
экземпляра он не может быть вызван.
Учитывая конкретный экземпляр, bar::getValue
это поставщик, потому что он просто получает значение из этого конкретного экземпляра Bar
. Но Bar::getValue
Bar
для его вызова необходимо предоставить экземпляр getValue()
. Итак, это Function<Bar, String>
.