【发布时间】:2017-07-01 06:08:14
【问题描述】:
我在玩 http://www.concretepage.com/java/jdk-8/java-8-unaryoperator-binaryoperator-example 的例子。
我发现真正令人困惑的是,当我在形成收集器时错误地将错误类型放入泛型之一时,java 编译器会给我一个非常误导性的消息:
不能从静态上下文中引用非静态方法
我的错误与现实中的静态与实例上下文无关:
Map<String, Map<Integer, Integer>> mapOfStudents = list.stream().collect(Collectors.groupingBy(Student::getClassName,
Collectors.toMap(Student::getName, Student::getAge)));
我的错误在于通用返回类型。当我更正并输入时:
Map<String, Map<String, Integer>> mapOfStudents
一切恢复正常。
有人可以解释这种令人困惑的错误消息背后的原因吗?我确信这是一个很好的,但我没有掌握它。
编辑:
~$ 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)
【问题讨论】:
-
我收到了与
javac截然不同的信息(更清晰)。尽管在使用方法引用/lambdas 时,我在 Eclipse 中也遇到过类似的错误消息。 -
请提供 Java 编译器的确切品牌和版本,因为类型推断是经常变化的事情之一。
-
查看编辑部分了解详情。我正在运行 Intellij Idea 2016.3
-
注意类似的消息here。
-
@JornVernee,你能举个例子来说明 Eclipse 中的错误消息吗?对于这个例子,Eclipse (head) 说:“类型不匹配:无法从 Map
> 转换为 Map >”,这对我来说非常好。
标签: java intellij-idea java-8