No se puede hacer referencia al método no estático desde un contexto estático en flujos de Java 8

Estaba jugando con ejemplos dehttp://www.concretepage.com/java/jdk-8/java-8-unaryoperator-binaryoperator-example.

Lo que me parece realmente confuso es que cuando erróneamente pongo un tipo incorrecto en uno de los genéricos al formar Collectors, el compilador de Java me da un mensaje muy engañoso:

El método no estático no puede ser referenciado desde un contexto estático

Mi error no tiene nada que ver con el contexto estático vs de instancia en realidad:

Map<String, Map<Integer, Integer>> mapOfStudents = list.stream().collect(Collectors.groupingBy(Student::getClassName,
            Collectors.toMap(Student::getName, Student::getAge)));

Mi error está en el tipo de devolución genérico. Cuando lo corrijo y pongo:

Map<String, Map<String, Integer>> mapOfStudents

Todo vuelve a la normalidad.

¿Alguien puede explicar la razón detrás de un mensaje de error tan confuso? Estoy seguro de que es bueno, pero no lo entiendo.

EDITAR:

~$ java -version
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-8u121-b13-0ubuntu1.16.04.2-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)

Respuestas a la pregunta(1)

Su respuesta a la pregunta