Я тестировал правила использования ссылок на методы, но написанный мной код не компилировался. Компилятор постоянно сообщает мне, что я не могу ссылаться на нестатический метод из статического контекста. Однако в документах 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));
}
}
Изменить: после прочтения ответов мне стало интересно, так ли это, что ссылка на метод экземпляра по имени класса работает только в некоторых функциональных интерфейсах, но не в других? Например,
BiPredicate <String, Integer> biPredicate = String::startsWith;
не компилируется, пока:
Predicate <String> predicate = String::isEmpty;
компилирует. Если это так, есть ли страница/руководство/что угодно, на что кто-нибудь может мне направить, объясняющее, какие интерфейсы функций совместимы, а какие нет?
String::startsWith
будет принимать 3 аргумента; 1. экземплярString
для вызова, 2. параметрString
prefix
и 3. параметрint
toffset
. НоBipredicate<String, Integer>
может составлять только 2 из них.String::isEmpty
принимает 1 параметр, экземпляр для вызова, поэтомуPredicate<String>
будет работать. - person Jorn Vernee   schedule 18.01.2017Predicate <String> predicate = String::isEmpty;
работает? Например, почему мне не нужно передавать новый экземплярString()
(как может указывать ваш ответ ниже на мой первоначальный вопрос)? - person Eddie Lin   schedule 18.01.2017test
принимает 1 параметр. Это не обязательно должно быть новым, любой экземпляр будет работать (в моем ответе я просто использовалnew Evaluation()
в качестве примера) - person Jorn Vernee   schedule 18.01.2017System.out.println("predicate.test(""));
верно? Мне не нужно создавать новый функциональный интерфейс с методом, который принимает что-то вроде(Evaluation instance, String a)
. Зачем мне это нужно для моего кода сBiPredicate
? Является лиBiPredicate
особым случаем? - person Eddie Lin   schedule 18.01.2017String::startsWith
, метод экземпляра, принимающий два аргумента, приводит к функции, принимающей три аргумента. Вашемуevaluate
нужен экземплярEvaluation
и два аргументаint
, следовательно, вам нужен тип функции с тремя параметрами. Поскольку функция Bi имеет только два параметра, она неуместна. А так как предустановленногоTriFunction
интерфейса нет, то приходится создавать свой собственный интерфейс. - person Holger   schedule 18.01.2017(instance, i, j) -> instance.evaluate(i, j)
. Три параметра. - person Holger   schedule 18.01.2017Predicate <String> predicate = String::isEmpty;
на что-то вродеPredicate <String> predicate = stringInstance::isEmpty;
, он не скомпилируется. Спасибо за все ваши ответы! - person Eddie Lin   schedule 18.01.2017