Я'м пытаясь понять, почему следующий код компилируется:
public class MethodRefs {
public static void main(String[] args) {
Function<MethodRefs, String> f;
f = MethodRefs::getValueStatic;
f = MethodRefs::getValue;
}
public static String getValueStatic(MethodRefs smt) {
return smt.getValue();
}
public String getValue() {
return "4";
}
}
Я могу понять, почему первое задание действует - getValueStatic
, очевидно, совпадает с заданным функция
тип (она принимает MethodRefs объект и возвращает строку), но второй сбивает меня с толку - то и getValue метод не принимает аргументов, так почему он до сих пор действует, чтобы назначить его на Ф
?
Второй
f = MethodRefs::getValue;
такой же, как и
f = (MethodRefs m) -> m.getValue();
Для нестатических методов всегда есть неявный аргумент, который представляется как это
в вызываемый.
Примечание: это на уровне байт-код, но он делает то же самое.
Нестатический метод, по сути, берет свое " это " справочник как особый вид спора. Как правило, этот аргумент записывается особым образом (перед именем метода, а в скобках после него), но концепция та же. В getValue метод
метод принимает объект MethodRefs
(его этот
) и возвращает строку, так что's совместимость с функцией<MethodRefs, строку>` интерфейс.
Позволяет плоти его немного:
import java.util.function.Function;
public class MethodRefs {
public static void main(String[] args) {
Function<MethodRefs, String> f;
final MethodRefs ref = new MethodRefs();
f = MethodRefs::getValueStatic;
f.apply(ref);
//is equivalent to
MethodRefs.getValueStatic(ref);
f = MethodRefs::getValue;
f.apply(ref);
//is now equivalent to
ref.getValue();
}
public static String getValueStatic(MethodRefs smt) {
return smt.getValue();
}
public String getValue() {
return "4";
}
}
В учебном руководстве по Java он объяснил, что есть 4 различных типов ссылок метода:
Ваш случай #3, это означает, что, когда у вас есть экземпляр MethodRef
, т. е. Реф
, звоню применить
функции Ф
будет эквивалентно строка s = Реф.метод getValue()
.
Для нестатических методов, типа это
является неявным первым аргументом типа. Поскольку она'ы типа MethodRefs
, типа проверить.