Ich habe testen Regeln für die Verwendung von Methodenreferenzen, aber der Code, den ich schrieb, würde nicht kompilieren. Der Compiler sagt mir immer wieder, dass ich aus einem statischen Kontext nicht auf eine nicht statische Methode verweisen kann. In den Java-Dokumenten wurde jedoch explizit geschrieben, dass es möglich ist, "::" zu verwenden, um "auf eine Instanzmethode eines beliebigen Objekts eines bestimmten Typs zu verweisen". Kann jemand darauf hinweisen, was mit meinem Code nicht stimmt? Vielen Dank!Mit Methodenreferenzen für eine Instanz zur Laufzeit in 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: Nachdem die Antworten zu lesen, ich frage mich, ob dies der Fall ist, dass eine Instanz Methode Referenzierung nur durch die Klassennamen in einigen funktionalen Schnittstellen, aber nicht in andere, das funktioniert? Zum Beispiel
BiPredicate <String, Integer> biPredicate = String::startsWith;
nicht kompilieren, während:
Predicate <String> predicate = String::isEmpty;
kompiliert. Wenn dies der Fall ist, gibt es eine Seite/Tutorial/was auch immer, auf die mich jemand verweisen kann, erklärt, welche Funktionsschnittstellen kompatibel sind und welche nicht?
Siehe auch [hier] (http://stackoverflow.com/questions/25512532/lambda-parameters) – Holger
'String :: startsWith' würde 3 Argumente nehmen; 1. die "String" -Instanz, auf die zugegriffen werden soll, 2. der "String" -Parameter "Präfix" und 3. der "int" -Parameter "toffset".Aber ein 'Bipredicate' kann nur 2 davon berücksichtigen. 'String :: isEmpty', nimmt 1 Parameter, die Instanz, auf der aufgerufen werden soll, so dass ein' Prädikat '_will_ funktioniert. –
@JornVernee Sie sind völlig richtig. Warum ist jedoch Prädikat Prädikat = String :: isEmpty; 'Arbeit? Warum muss ich nicht eine neue Instanz von "String()" übergeben (wie Ihre Antwort unten auf meine ursprüngliche Frage zeigen kann)? –