Я тестировал правила использования ссылок на методы, но код, который я написал, не компилировался. Компилятор продолжает сообщать мне, что я не могу ссылаться на нестатический метод из статического контекста. Однако в Java-документах он явно писал, что можно использовать «::» для «ссылки на метод экземпляра произвольного объекта определенного типа». Кто-нибудь может указать, что не так с моим кодом? Спасибо!Использование ссылок метода на экземпляр, который будет определен во время выполнения в 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));
}
}
Edit: После прочтения ответов, мне было интересно, если это тот случай, который ссылается метод экземпляра по имени класса работает только в некоторых функциональных интерфейсах, но не в остальных? Например,
BiPredicate <String, Integer> biPredicate = String::startsWith;
не компилируется, а:
Predicate <String> predicate = String::isEmpty;
компилирует. Если это так, есть ли страница/учебник/все, что кто-либо может мне сослаться на это, объясняет, какие функциональные интерфейсы совместимы, а какие нет?
См. Также [здесь] (http://stackoverflow.com/questions/25512532/lambda-parameters) – Holger
'String :: startsWith' будет принимать 3 аргумента; 1. экземпляр «String» для вызова, 2. параметр 'String'' prefix' и 3. параметр 'int'' toffset'.Но 'Bipredicate' может содержать только 2 из них. 'String :: isEmpty', принимает 1 параметр, экземпляр для вызова, так что' Predicate '_will_ работает. –
@JornVernee Вы совершенно правы. Однако почему 'Predicate предикат = String :: isEmpty; 'работа? Например, почему мне не нужно передавать новый экземпляр 'String()' (Как может быть указано ниже на мой исходный вопрос)? –