我很难理解为什么以下代码会编译:
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
显然与指定的Function
类型匹配(它接受MethodRefs
对象并返回String
),但是第二个让我感到困惑 - getValue
方法不接受任何参数,那么为什么将它分配给f
仍然有效?
答案 0 :(得分:50)
第二个
f = MethodRefs::getValue;
与
相同f = (MethodRefs m) -> m.getValue();
对于非静态方法,总是有一个隐式参数,在被调用者中表示为this
。
注意:字节代码级别的实现略有不同,但它的功能相同。
答案 1 :(得分:9)
非静态方法本质上将其this
引用作为一种特殊的参数。通常,该参数是以特殊方式编写的(在方法名称之前,而不是在其后的括号内),但概念是相同的。 getValue
方法使用MethodRefs
对象(其this
)并返回一个字符串,因此它与Function<MethodRefs, String>
接口兼容。
答案 2 :(得分:9)
让我们充实一点:
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";
}
}
答案 3 :(得分:6)
在Java教程中,解释了有4种不同类型的方法引用:
您的案例是#3,这意味着如果您有MethodRef
的实例,即ref
,则在您的函数apply
上调用f
将等同于{{1 }}
答案 4 :(得分:5)
对于非静态方法,ggplot
的类型被隐式地视为第一个参数类型。由于它是this
类型,因此检查类型。