当前位置: 首页 > 知识库问答 >
问题:

为什么在这个Java8流示例中上下文是静态的?

彭烨烁
2023-03-14
public void test(){

    Stream<Integer> stream = Stream.of(1,2,3);
    stream.map(Integer::toString);
}

我得到两个错误:

Java:不兼容类型:无法推断类型变量R(参数不匹配;方法引用无效)

对toString的引用是不明确的,java.lang.Integer中的方法toString(int)和java.lang.Integer中的方法toString()都是不明确的

public static String toString(int i)
public String toString()

并且编译器无法推断所需的方法引用。

但是关于第二个,编译器引用的静态上下文在哪里?

这个错误与Integer类的方法toString()有关,它不是静态的,但是为什么我使用map()调用该方法的上下文是静态的呢?

共有1个答案

狄凯
2023-03-14

第二个错误是转移注意力。它公开了编译器的一些内部工作。问题是存在歧义问题,第二个是歧义的后果,可以忽略不计。它可能正在做的事情如下。

>

  • 它检查是否有与“有效”签名匹配的静态方法。有,所以它假设静态是要走的路。这强烈地暗示在编译器中存在一种静态方法的“首选项”,尽管这可能是任意的。

    然后,它将查找与签名匹配的第一个方法。它不是静态的,所以它会混淆,因为它以前确实找到了带有该签名的静态方法。

  •  类似资料:
    • 问题内容: 我对Java中的匿名类有什么误解。考虑以下简单示例: 演示 为什么要编译代码?在JLS,CHAPT 15 说: 匿名类始终是内部类(第8.1.3节);它永远不会是静态的 但是JLS,第8章 内部类是未显式或隐式声明为static的嵌套类。 因此,匿名类是内部类。但是我们在静态上下文中使用它们。为什么这里正确? 问题答案: 可以在静态上下文中创建类而无需将其声明为静态,这就是在这里发生的

    • 我对Java中的匿名类有一个误解。考虑下面的简单例子: 演示 代码为什么编译?JLS,第15章说: 匿名类总是一个内部类(§8.1.3);它从来不是静态的 但是JLS,第8章 内部类是没有显式或隐式声明为静态的嵌套类。 所以匿名类是一个内部类。但是我们在静态上下文中使用它们。为什么这里是正确的?

    • 记录器应该始终是最终的和静态的吗? 我意识到基本上是必需的,所以我想知道在非静态上下文中使用SLF4J的开销实际上有多高。 问:

    • 在Hadoop字数统计示例中,IntWritable被设置为静态,以便可以在同一JVM中重用,而不是创建新的。我的问题是为什么不让文本也保持静态?我做到了,而且工作得很好,但从未在任何例子中看到过。我遗漏了什么吗? 原字数统计示例。

    • 问题内容: 我对java8流中和方法之间的区别感到困惑。例如, 我得到空的输出在这里,但如果我改变地图就像 我可以得到 {1 = 1,2 = 2} 为什么只是没有运行方法?它们之间有什么区别? 问题答案: 什么都不做,因为在执行终端操作之前不会处理流管道。因此,残留物为空。 在流管道中添加终端操作将导致针对终端操作所需的每个元素执行操作(某些终端操作仅需要一个元素,而其他终端操作则需要的所有元素)

    • 问题内容: 我正在尝试编写此代码以获取第一个initialCapacity质数,然后使用java按顺序打印它们。它不起作用有两个原因,首先是我得到了错误 41:不能从静态上下文中引用非静态变量listOfPrimeNumbers 当我尝试运行程序时,即使将变量更改为static并运行程序,它也只会打印出“ 1”。因此,仅在构造函数Primes中迭代一次while循环,然后停止,无论我多么努力,我都