왜 이 방법을 참조 할당을 컴파일할?

나는'm 고군분투하는 이유 다음과 같은 코드를 컴파일:

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?

질문에 대한 의견 (2)
해결책

두 번째

f = MethodRefs::getValue;

와 동일

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

에 대한 정적이 아닌 방법을은 항상있다는 암시적 인수는 표현으로에서 수신자.

참고:이행은 약간 다른 바이트 코드 수준이지만 그것이 동일한 것입니다.

해설 (3)

Non-static 방법을 근본적으로는참조로 특별한 종류의 인수입니다. 일반적으로는 인수에 기록된 특별한 방법(전에 메서드 이름 대신에 괄호 안에 후)지만,그 개념은 이 같습니다. 는getValue메소드MethodRefs체(의)문자열을 반환합니다,그래서 그's 과 호환되는기능이<MethodRefs,String>인터페이스입니다.

해설 (0)

사이 육신이 그것을 밖으로 비트:

import java.util.function.Function;

public class MethodRefs {

  public static void main(String[] args) {
    Function 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";
  }
}
해설 (0)

Java 튜토리얼 그것은 설명이 있다는 4 가지 유형의 방법을 참조:

  1. 참조하는 정적 방법
  2. 인스턴스에 대한 참조 방법의 특정 객체
  3. 인스턴스에 대한 참조 방법의 임의의 객체를 특정 유형의
  4. 대한 참조를 생성자

귀하의 경우에는 3 위는 것을 의미가 있을 때 인스턴스의MethodRef즉,심판호출적용에서 당신의 기능을f상응하는 것입니다문자열 s=ref.getValue().

해설 (0)

에 대한 비정적 방법,형식의는 암시적으로 고려하는 첫 번째 인수 유형입니다. 이후 그's 형식의MethodRefs,유형을 확인합니다.

해설 (0)