gpt4 book ai didi

Java 静态导入

转载 作者:IT老高 更新时间:2023-10-28 21:19:21 26 4
gpt4 key购买 nike

只是通过实验,我发现即使在静态上下文中,Java 非静态方法也会覆盖范围内所有相同命名的方法。即使不允许参数重载。喜欢

import java.util.Arrays;    
import static java.util.Arrays.toString;

public class A {
public static void bar(Object... args) {
Arrays.toString(args);
toString(args); //toString() in java.lang.Object cannot be applied to (java.lang.Object[])
}
}

我在规范中找不到任何关于此的信息。这是一个错误吗?如果不是,是否有任何理由实现这样的语言?

UPD:Java 6 不编译此示例。问题是 - 为什么?

最佳答案

解释很简单,但并没有改变行为非常不直观的事实:

当解析要调用的方法时,编译器首先要做的是找到具有正确名称的方法的最小封闭范围。只有这样才会有其他东西,比如重载决议和游戏中的 co。

现在这里发生的是包含 toString() 方法的最小封闭范围是从 Object 继承它的 A 类。因此,我们停在那里,不再寻找更远的地方。可悲的是,接下来编译器会尝试在给定范围内找到最适合的方法,并注意到它无法调用其中任何一个并给出错误。

这意味着从不静态导入名称与 Object 中的方法相同的方法,因为 自然在范围内的方法优先于静态导入(JLS详细描述了方法阴影,但对于这个问题,我认为记住这一点要简单得多。

编辑:@alf请提交 describes the method invocation 的 JLS 的正确部分对于那些想要全貌的人。它相当复杂,但问题也不简单,所以这是意料之中的。

关于Java 静态导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8972179/

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