Как ссылка на метод разрешается в Java - PullRequest
2 голосов
/ 08 апреля 2020
Function<String, Integer> f = Integer::new;

Integer i = f.apply("100");

Как это использовать Integer.parseInt, когда мы звоним f.apply?

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Я предполагаю, что ваш вопрос звучит так: «Как javac знает, как вызвать parseInt здесь»?

Ваш фрагмент поврежден; дженерики отвалились. Ваш код не будет компилироваться, так как ссылка неоднозначна. Если вы добавите его обратно, он скомпилируется и будет работать как обычно:

Function<String, Integer> f = Integer::new;
Integer i = f.apply("100");

Забудьте новый синтаксис :: или часть Function; это красные селедки.

Итак, давайте сделаем это проще:

Integer i = new Integer("100");

Это действительно Java; в итоге я получу значение 100.

Это работает, потому что ... этот конструктор существует. Предполагается, что он будет действовать точно так же, как Integer.parseInt с основанием 10 произведений, и не рекомендуется по двум веским причинам: [A] вызов new Integer() вообще, с любым значением, не рекомендуется (используйте Integer.valueOf), и [B] просто вызовите parseInt.

0 голосов
/ 08 апреля 2020

Во-первых, это не ссылка на метод, это лямбда.

Что вы можете сделать, это Function<String, Integer> f = Integer::parseInt.

Компилятор Java превращает это лямбда-выражение в объект Function, где метод apply переопределяется содержимым лямбда-выражения. Лямбда-выражения - это, по сути, сахар syntacti c, который вы используете для создания экземпляров интерфейсов, которые имеют только один метод (они называются функциональными интерфейсами). Для всех намерений и целей, которые лямбда будет расширена до:

class FunctionImpl extends Function<String, Integer> {
  @Override
  public Integer apply(String s) {
    return new Integer(s); //which calls Integer.parseInt(s) internally
  }
}
Function f = new FunctionImpl();

Однако в фактическом байт-коде есть новый сгенерированный метод и специальный код операции, называемый invokevirtual, который вызывает этот метод.

0 голосов
/ 08 апреля 2020

apply происходит от Java 8 Функция класс.

R apply (T t)

Применяет эту функцию к данному аргументу.

Параметры: t - аргумент функции Возвращает: результат функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...