提问者:小点点

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


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

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仍然有效呢?


共3个答案

匿名用户

第二张

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)并返回一个字符串,因此它与函数兼容