Ответ 1
Сначала следует отметить, что сообщение выдается не java-компилятором (javac), а IntelliJ IDEA. Вы можете видеть сообщения javac в окне "Построение сообщений" при запуске процесса сборки. То, что вы видите в окне редактора, - это сообщения, созданные самой IDEA, и они могут отличаться.
Сообщение об ошибке вводит в заблуждение из-за реализации эталонного разрешения метода в IntelliJ IDEA. Он считает, что ссылка на нестатические методы должна быть разрешена только в том случае, если число соответствующих аргументов SAM (одиночный абстрактный метод) равно числу аргументов метода плюс один и первый тип аргумента SAM, совместимый с методом, содержащим класс. См. реализация (также метод isSecondSearchPossible
выше, для методов varargs выполняется дополнительная магия).
Он работает правильно, если ваша программа не имеет ошибок. Однако, если у вас есть несоответствующий тип, общие аргументы Function
, переданные в toMap
, не могут быть заменены, поэтому он остается Function<T, R>
, а его первый аргумент метода apply
- это просто T
, который не соответствует тип Student
. Таким образом, происходит так называемый "второй поиск", и IDEA считает, что метод ссылается на статический контекст. Хотя статический и нестатический контексты здесь не применимы, нестатический контекст лучше соответствует вашему методу, по крайней мере, в соответствии с количеством аргументов, поскольку метод getName()
не получает аргументов. С другой стороны, логика IDEA - "если нестатический контекст не применим, то это статический контекст", следовательно, сообщение об ошибке.
Я рассматривал бы это как ошибку или, по крайней мере, как проблему юзабилити. Я только что зарегистрировал его здесь на основе аналогичного вопроса. Надеюсь, мы это исправим.
Отказ от ответственности: я разработчик IntelliJ IDEA.
Обновление: исправлено в IDEA 2017.2.