Hallo Forum,
beim Thema Methodenreferenzen in Java 8 bin ich über etwas gestolpert, dass ich zwar schon verwende, es aber nicht 100% verstehe. Gegeben sei folgende Klasse:
String myString;
/**
* Methoden können per Methodenreferenz als Implementierung funktionaler Interfaces genutzt werden.
* Diese Methode ist ein Supplier<String>
*/
public String getMyString() {
return myString;
}
/**
* Methoden können per Methodenreferenz als Implementierung funktionaler Interfaces genutzt werden.
* Diese Methode ist ein Consumer<String>
*/
public void setMyString(String myString) {
this.myString = myString;
}
}```
Die Klasse implementiert kein Interface und hat mehrere nicht abstrakte Methoden. Sie ist also selbst KEINE Implementierung eines funktionalen Interfaces. Das nur als Hinweis, um Verwechslungen zu vermeiden.
Zur Verwendung der Klasse folgender Code:
```public final class Main {
public static void main(String[] args) {
MyBean unerTest = new MyBean();
// 1. Übergabe einer Methodenreferenz auf einer INSTANZ von MyBean als Supplier.
// Nichts Überraschendes
withSupplier(underTest::getMyString);
// 2. Übergabe einer Methodenreferenz der KLASSE MyBean
// Hier ist ein Supplier plötzlich eine Function.
withFunction(MyBean::getMyString);
}
static void withSupplier(Supplier<String> stringSupplier) {
// do nothing, just test, if compiles
}
static void withFunction(Function<MyBean,String> myBeanToString) {
// do nothing, just test, if compiles
}
}```
Unabhängig von der Sinnhaftigkeit obigen Codes (es ist ja auch nur ein Beispiel zur Verdeutlichung): Wie wird eine Methode, die offensichtlich ein Supplier ist, zu einer Function, wenn ich eine "statische" Methodenreferenz übergebe (Punkt 2. im Code)? Was macht der Compiler da?