当前位置: 首页 > 面试题库 >

无法从Java 8流中的静态上下文引用非静态方法

申屠裕
2023-03-14
问题内容

我正在玩http://www.concretepage.com/java/jdk-8/java-8-unaryoperator-
binaryoperator-
example中的

示例

我真正感到困惑的是,当我在形成收集器时错误地将错误的类型放到一个泛型中时,java编译器给了我一个非常令人误解的信息:

无法从静态上下文引用非静态方法

我的错误与现实中的静态vs实例上下文无关:

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)

问题答案:

首先应该注意,该消息不是由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。中修复



 类似资料:
  • 我正在编写此代码,它显示了错误非静态方法googleapiability . isgoogleplayservicesavailable(上下文上下文)和googleapiability . get error dialog(Activity Activity,int errorCode,int requestCode)不能从静态上下文中引用。

  • 我正在尝试编写一段代码,当我选中两个复选框中的一个复选框时,它将更改我选择按钮时显示的消息。 我收到的错误消息是: "FirstWindow.java:12:错误:不能从静态上下文消息中引用非静态变量消息="good job\n";" 对于第12、37、53、57行。我已尝试在main中声明字符串变量,但我只会收到错误: “FirstWindow。java:38:错误:从内部类引用的局部变量必须是

  • 问题内容: 我想一劳永逸地理解这一点。 为此,请原谅下面粘贴的大量代码,但是我不想遗漏任何细节。 我唯一更改的是加载的URL。但这不会导致错误。 我想将我的函数称为“ readPosiitons ”。简单的解决方案,使其静态。真正的解决方案,我不确定。 请帮助我更好地了解如何以正确的方式解决此错误。 谢谢!! 问题答案: 真正的解决方案?不要在方法中放太多东西。那是给菜鸟的。 Java是一种面向对

  • 问题内容: 我对Java和一般编程非常陌生。我为一个基本程序编写了此代码,以将用户输入的2个数字相加,并将它们加起来并显示在输出框中,但是我得到了,但是我不知道什么是静态的 给出错误的行: 抱歉,如果我非常不称职,但我搜索了一下,但我真不明白该如何解决。谢谢。 问题答案: 在静态上下文中,您没有对象(类的实例),但是实例变量和方法取决于它们。 您有一个名为output1的实例,但是您尝试通过类的名

  • 可能重复: 为什么我得到“非静态变量不能从静态上下文引用”? 这是代码 错误说: 不能从静态上下文引用非静态类节点 为什么我不应该在main()方法中引用Node类?

  • 我使用了http://www.concretepage.com/java/jdk-8/java-8-unaryoperator-binaryoperator-example中的示例。 我发现真正令人困惑的是,当我在形成收集器时错误地将一个错误的类型放入其中一个泛型中时,Java编译器给了我一个非常误导的信息: 不能从静态上下文引用非静态方法 我的错误与现实中的静态vs实例上下文无关: 我的错误是在