2015-05-08 3 views
8

Рассмотрят следующий код:Java 8 Типа вывод с нестатическим доступом статических членов

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 
    } 

} 

Я наткнулся на это на другой день, когда случайно вызов статического метода в нестатическом способе. Я знаю, что вы не должны ставить статические методы нестационарным образом, но мне все же интересно, почему нельзя выводить тип в этом случае?

+4

Возможно, потому, что дизайнеры не захотели повторить ошибку, которая была сделана при авторизации статических методов, которые вызывают нестационарным способом. –

ответ

4

Фактически ошибка говорит invalid method reference static bound method reference.

Который имеет смысл, если вы know about четыре типа методов ссылки:

  1. Ссылка на статический метод.
  2. Ссылка на связанный нестатический метод.
  3. Ссылка на несвязанный нестатический метод.
  4. Ссылка на конструктор

JLS объяснение:

Это ошибка во время компиляции, если метод опорного выражение имеет вид ReferenceType :: [TypeArguments] Идентификатор, и время компиляции декларация статична, а ReferenceType - не простое или квалифицированное имя

В дополнение к плохой конструкции накладные расходы на производительность для захвата (ограничения) приемника.