2015-05-08 13 views
8

Betrachten Sie den folgenden Code ein:Java 8 Typinferenz mit nicht-statischen Zugriff von statischen Mitglieder

class Test { 

    void accept(Consumer<Integer> c) {} 

    static void consumer(Integer i) {} 

    void foo() { 
     accept(this::consumer); // The method accept(Consumer<Integer>) in the type Test is not applicable for the arguments (this::consumer) 
     accept(Test::consumer); // Valid 
    } 

} 

ich über dieses neulich kam, als zufällig eine statische Methode in einer nicht-statische Art und Weise aufrufen. Ich weiß, dass Sie statische Methoden nicht auf nicht statische Weise aufrufen sollten, aber ich frage mich immer noch, warum ist es nicht möglich, den Typ in diesem Fall abzuleiten?

+4

Wahrscheinlich, weil die Designer nicht den Fehler wiederholen wollten, der bei der Autorisierung statischer Methoden gemacht wurde, um auf nicht statische Weise aufgerufen zu werden. –

Antwort

4

Eigentlich Fehler sagt invalid method reference static bound method reference.

Welchen Sinn, wenn man know about vier Arten von Methoden Referenzen macht:

  1. Verweis auf eine statische Methode.
  2. Verweis auf eine gebundene nicht-statische Methode.
  3. Verweis auf eine nicht gebundene nicht statische Methode.
  4. Verweis auf einen Konstruktor

JLS Erklärung:

Es ist ein Fehler bei der Kompilierung, wenn eine Methode Referenz Ausdruck der Form Reference hat :: [Typearguments] Identifier und die Compile-Zeit Die Deklaration ist statisch, und ReferenceType ist kein einfacher oder qualifizierter Name.

Zusätzlich zum schlechten Design gibt es einen Leistungs-Overhead für die Erfassung (Begrenzung) des Empfängers.

Verwandte Themen