我很难理解为什么要编译以下代码:
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仍然有效呢?
第二张
f = MethodRefs::getValue;
与相同
f = (MethodRefs m) -> m.getValue();
对于非静态方法,始终有一个隐式参数,在被调用方中表示为this。
注意:实现在字节码级别略有不同,但它做的是相同的事情。
让我们把它充实一点:
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";
}
}
非静态方法本质上将其this
引用作为一种特殊的参数。通常该参数以特殊的方式编写(在方法名称之前,而不是在它之后的括号中),但概念是相同的。getValue
方法接受一个omeodRefs
对象(其this
)并返回一个字符串,因此它与函数兼容