#java
#java
Вопрос:
Function<Integer, String> intToString = Object::toString
приведенный выше код является примером ссылки на метод
Пожалуйста, помогите мне, как это работает.
Согласно моему пониманию, ссылка на метод должна иметь ту же сигнатуру метода, что и абстрактный метод функционального интерфейса (R apply(T) ).
Комментарии:
1.
Function<Integer, String>
это то, что может использовать целое число и возвращает строку.Object::toString
может использовать целое число (и действительно любой объект) и возвращать строку. Таким образом, он соответствует.2.
Object::toString
(принимаетObject
) — это не то же самое,someObject::toString
что (ничего не принимает).
Ответ №1:
По сути, вы правы. Чтобы присвоить что-то переменной, объявленной как
Function<Integer, String> intToString = value;
тогда value
должно быть Function<Integer, String>
что-то, что имеет
public String apply(Integer t) { ... }
метод.
Сложность в том, что ссылочное выражение метода like Object::toString
является синтаксическим сахаром для
Function<Integer, String> intToString = new Function<Integer,String>() {
public String apply(Integer t) {
return t.toString();
}
};
И как он узнает параметры Integer
String
типа и, которые не упоминаются только в выражении Object::toString
? Это происходит с левой стороны присваивания. Компилятор знает, какой тип функции ожидается, и создает соответствующий внутренний анонимный Function
экземпляр из ссылки на метод Object::toString
.
Предостережение: ссылка на метод Object::toString
допускается только в ситуациях, когда компилятор может четко определить, какой тип ожидается, поскольку тип этого выражения неясен. В зависимости от контекста (например, с левой стороны), то же Object::toString
самое может также стать a Consumer<Point>
вместо a Function<Integer, String>
, а затем реализовать метод void accept(Point t)
.