메서드 참조를 사용하는 규칙을 테스트했지만 필자가 작성한 코드는 컴파일되지 않습니다. 컴파일러는 정적 컨텍스트에서 비 정적 메서드를 참조 할 수 없다는 것을 계속해서 알려줍니다. 그러나 Java Documents에서는 명시 적으로 "::"을 사용하여 "특정 유형의 임의 객체의 인스턴스 메소드에 대한 참조"를 사용할 수 있다고 썼습니다. 아무도 내 코드에 문제가 있음을 지적 할 수 있습니까? 고맙습니다!Java에서 런타임에 인스턴스에서 메서드 참조를 사용할 때
package Test;
import java.util.function.BiPredicate;
class Evaluation {
public boolean evaluate(int a, int b) {
if (a-b ==5){
return true ;
}
return false;
}
public void methodTest() {
BiPredicate<Integer, Integer> biPredicate = Evaluation::evaluate;
System.out.println(biPredicate.test(6,1));
}
}
편집 :이 경우는 클래스 이름으로 인스턴스 메서드를 참조하는 것은 단지 다른 사람의 일부 기능 인터페이스에서 작동하지만하지 않는 것이 경우 답변을 읽고 나면, 궁금 해서요?
Predicate <String> predicate = String::isEmpty;
컴파일 : 동안 예를 들어,
BiPredicate <String, Integer> biPredicate = String::startsWith;
는 컴파일되지 않습니다. 이 경우 누군가가 나를 참조 할 수있는 페이지/튜토리얼/어떤 것이있어 어떤 기능 인터페이스가 호환 가능하고 어떤 기능 인터페이스가 아닌지를 설명 할 수 있습니까?
public void methodTest(){
BiPredicate<Integer, Integer> biPredicate = this::evaluate;
System.out.println(biPredicate.test(6,1));
}
어떤 인스턴스 변수 또는 메소드를 사용하지 않기 때문에, 당신은 단순히 정적 만들 수 : 당신의 방법은 인스턴스 메서드 인 경우
참고 사항 [here] (http://stackoverflow.com/questions/25512532/lambda-parameters) – Holger
'String :: startsWith'는 3 개의 인수를 취합니다. 1. 호출 할 String 인스턴스, 2. String 매개 변수 접두사 및 3. int 매개 변수 toffset.그러나 Bipredicate는 그것들 중 2 개만을 설명 할 수 있습니다. 'String :: isEmpty'는 1 매개 변수, 즉 호출 할 인스턴스를 취합니다. 따라서'술어 '_will_이 작동합니다. –
@ JornVernee 당신은 완전히 옳습니다. 그러나, 왜 '술어 술어 = 문자열 :: isEmpty; '일해? 왜 내가'String()'의 새로운 인스턴스를 전달할 필요가 없는지 (내 원래의 질문에 대한 당신의 대답이 나타낼 수 있듯이)? –