2014-10-02 15 views
10

Warum funktioniert das nicht? Ich erhalte den Compilerfehler "Statische Referenz auf die nicht statische Methode kann nicht gedruckt werden ..."Java 8 Methode Referenz zur nicht statischen Methode

public class Chapter3 { 
    public void print(String s) { 
     System.out.println(s); 
    } 
    public static void main(String[] args) { 
     Arrays.asList("a", "b", "c").forEach(Chapter3::print); 
    } 
} 

Antwort

3

Ich denke, ich habe es jetzt. Was ist in der Stream vom Typ String daher kann ich nicht auf einen String intance drucken nennen ...

Zum Beispiel diese

public class Chapter3 { 
final String value; 

public Chapter3(String value) { 
    this.value = value; 
} 

public void print() { 
    System.out.println(value); 
} 

public static void main(String[] args) { 
    Arrays.asList(new Chapter3("a"), new Chapter3("b")).forEach(Chapter3::print); 
} 
} 
7

forEach arbeitet ein Consumer<? super T> akzeptiert (seine Unterschrift ist default void forEach(Consumer<? super T> action)), die eine funktionale Schnittstelle mit einer Methode accept(T t), die ein einzelnes Argument hat. Wenn Sie eine nicht statische Methodenreferenz einer Methode mit einem Argument übergeben, haben Sie tatsächlich zwei Argumente - die this Referenz auf die Chapter3 Instanz und das String-Argument. Dies stimmt nicht mit dem überein, was forEach erwartet.

10

Unabhängig davon, ob Sie Methodenverweise, Lambda-Ausdrücke oder normale Methodenaufrufe verwenden, erfordert eine Instanzmethode eine geeignete Instanz für den Aufruf. Die Instanz kann durch den Funktionsaufruf geliefert werden, z. Wenn forEach eine BiConsumer<Chapter3,String> erwartet, hat es funktioniert. Aber da forEach in Ihrem Fall eine Consumer<String> erwartet, gibt es keine Instanz von Chapter3 im Bereich. Sie können dieses Problem beheben leicht durch entweder, Chapter3.print zu einem static Verfahren zu ändern oder durch eine Instanz als Ziel für den Methodenaufruf bereitstellt:

public class Chapter3 { 
    public void print(String s) { 
     System.out.println(s); 
    } 
    public static void main(String[] args) { 
     Arrays.asList("a", "b", "c").forEach(new Chapter3()::print); 
    } 
} 

Hier das Ergebnis new Chapter3(), eine neue Instanz von Chapter3, wird erfasst werden die Methodennachweis auf seine print Methode und eine Consumer<String> Aufruf der Methode für diese Instanz kann konstruiert werden.

+0

eine Zeile Antwort ist: es gibt keine Instanz von Chapter3 im Bereich ..... danke, Sie löste meine Zweifel. –

Verwandte Themen