Подтвердить что ты не робот

Ссылки методов для непустых аргументов?

Я читал о функциях Java 8, и я увидел, что у них есть ссылки на методы, но я не видел, как указать, какой метод, когда метод перегружен. Кто-нибудь знает?

4b9b3361

Ответ 1

Из этот FAQ лямбда:

Где можно использовать лямбда-выражения?

  • Аргументы метода или конструктора, для которых целевой тип является типом соответствующий параметр. Если метод или конструктор перегружены, обычные механизмы разрешения перегрузки используются до лямбда выражение соответствует целевому типу. (После разрешения перегрузки, все еще может быть более одного метода или конструктора соответствия подпись, принимающая различные функциональные интерфейсы с идентичными функциональные дескрипторы. В этом случае выражение лямбда должно быть приведение к типу одного из этих функциональных интерфейсов);

  • Литые выражения, которые явно задают целевой тип. Например:

Object o = () -> { System.out.println("hi"); };       // Illegal: could be Runnable or Callable (amongst others)
Object o = (Runnable) () -> { System.out.println("hi"); };    // Legal because disambiguated

Итак, вам нужно будет указать его, если есть неоднозначные подписи.

Ответ 2

Компилятор будет соответствовать сигнатуре метода с функциональным интерфейсом.

Integer foo(){...}

Integer foo(Number x){...}

Supplier<Number>          f1 = this::foo;  // ()->Number, matching the 1st foo

Function<Integer, Number> f2 = this::foo;  // Int->Number, matching the 2nd foo

По существу, f2 - это то, что может принять Integer и вернуть a Number, компилятор может узнать, что 2-й foo() отвечает требованиям.