Как java.util.function.Функция может иметь ссылку на метод класса объекта toString метод

#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) .