为什么会编译此方法引用赋值?

2022-09-01 00:58:22

我很难理解为什么编译以下代码:

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";
    }

}

我可以看到为什么第一个赋值是有效的 - 显然与指定的类型匹配(它接受一个对象并返回一个),但第二个赋值让我感到困惑 - 该方法不接受任何参数,那么为什么将其赋值仍然有效?getValueStaticFunctionMethodRefsStringgetValuef


答案 1

第二个

f = MethodRefs::getValue;

与 相同

f = (MethodRefs m) -> m.getValue();

对于非静态方法,总是有一个隐式参数,它表示为在被调用方中。this

注意:在字节码级别,实现略有不同,但它执行相同的操作。


答案 2

让我们充实一下:

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";
  }
}

推荐