gpt4 book ai didi

java - 为什么上下文在这个 Java 8 流示例中是静态的?

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:44 25 4
gpt4 key购买 nike

在 Java 8 中有以下简单的方法:

public void test(){

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

我得到两个错误:

java: incompatible types: cannot infer type-variable(s) R (argument mismatch; invalid method reference

reference to toString is ambiguous both method toString(int) in java.lang.Integer and method toString() in java.lang.Integer

和:

invalid method reference non-static method toString() cannot be referenced from a static context

第一个错误可以理解,Integer类有两个方法:

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

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

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

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

还有一个问题,如果编译器必须解决两个方法之间的歧义,一个导致编译时错误,他不应该选择另一个吗?

最佳答案

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

  1. 它检查是否有一个静态方法匹配“有效”签名。有,所以它假设静态是方式去。这强烈暗示存在某种“偏好”在静态方法的编译器中,虽然这可能是任意。

  2. 然后它会去寻找第一个匹配签名的方法。它不是静态的,所以它会感到困惑,因为它之前确实找到了具有该签名的静态方法。

在混合的某个地方,它还发现引用不明确。不清楚第 1 步还是第 2 步是发生这种情况的地方,但编译器不会中止,因为它试图提供帮助并找到更多编译错误。

编译器理论上可以更好地处理这个问题,因为第二条消息令人困惑。

注意:Eclipse 编译器不会显示第二个错误。

关于java - 为什么上下文在这个 Java 8 流示例中是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com