왜 이 방법을 참조 할당을 컴파일할?
나는'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
?
44
5
두 번째
와 동일
에 대한 정적이 아닌 방법을은 항상있다는 암시적 인수는 표현으로
이
에서 수신자.참고:이행은 약간 다른 바이트 코드 수준이지만 그것이 동일한 것입니다.
Non-static 방법을 근본적으로는
이
참조로 특별한 종류의 인수입니다. 일반적으로는 인수에 기록된 특별한 방법(전에 메서드 이름 대신에 괄호 안에 후)지만,그 개념은 이 같습니다. 는getValue
메소드MethodRefs
체(의이
)문자열을 반환합니다,그래서 그's 과 호환되는기능이<MethodRefs,String>
인터페이스입니다.사이 육신이 그것을 밖으로 비트:
Java 튜토리얼 그것은 설명이 있다는 4 가지 유형의 방법을 참조:
귀하의 경우에는 3 위는 것을 의미가 있을 때 인스턴스의
MethodRef
즉,심판
호출적용
에서 당신의 기능을f
상응하는 것입니다문자열 s=ref.getValue()
.에 대한 비정적 방법,형식의
이
는 암시적으로 고려하는 첫 번째 인수 유형입니다. 이후 그's 형식의MethodRefs
,유형을 확인합니다.