java - 当本地定义具有不同参数的函数时,无法调用静态导入的重载函数吗?

标签 java import static overloading adhoc-polymorphism

我有以下简单的 Java 代码:

A.java

import static a.A1.*;
import static a.A2.*;
class Main {
    public static int g() {return 999;}
    static {
        System.out.println("f('a'): " + f('a'));
        System.out.println("f(): " + f());
        //System.out.println("g('a'): " + g('a'));
        System.out.println("g(): " + g());
    }
}

a/A1.java

package a;
public class A1 {
    public static int f(char x) {return 1;}
    public static int g(char x) {return 123;}
}

a/A2.java

package a;
public class A2 {
    public static int f() {return 0;}
}

f 被定义了两次,并带有重载的参数。如您所见,静态导入 f 的两个定义并调用它们是有效的:

$ javac *.java a/*.java && java Main
f('a'): 1
f(): 0
g(): 999
Exception in thread "main" java.lang.NoSuchMethodError: main

但是当我在本地定义 g 并从某处静态导入它时,它不起作用。以下是我在 Main.java 中取消注释第 8 行时的输出:

$ javac *.java a/*.java && java Main
B.java:8: g() in Main cannot be applied to (char)
        System.out.println("g('a'): " + g('a'));
                                        ^
1 error

为什么?

我尝试将本地 g 更改为非静态,并删除对本地 g 的调用:

import static a.A1.*;
import static a.A2.*;
class Main {
    public int g() {return 999;}
    static {
        System.out.println("f('a'): " + f('a'));
        System.out.println("f(): " + f());
        System.out.println("g('a'): " + g('a'));
    }
}

但是没有成功:

$ javac *.java a/*.java && java Main
B.java:8: g() in Main cannot be applied to (char)
        System.out.println("g('a'): " + g('a'));
                                        ^
1 error

最佳答案

发生这种情况是因为类中声明的名为 g 的方法正在隐藏按需静态导入的名为 g 的方法。请参阅JLS §6.4.1 - Shadowing:

A declaration d of a method named n shadows the declarations of any other methods named n that are in an enclosing scope at the point where d occurs throughout the scope of d.

关于java - 当本地定义具有不同参数的函数时,无法调用静态导入的重载函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942059/

相关文章:

Java将单个字符从char数组转换为String数组

java - 将字符串数组转换为 double 组

java - 在 Java 程序中从 Unix 路径读取一个 hadoop 配置文件

python - 在 Jupyter Notebook 中导入模块 - 路径

java - 将类的静态变量重新初始化为它们的原始值java

java - 静态 block 初始化

java - 正确的 FQDN Uri 通过 apache commons UrlValidator 无效

JAVA - 将 CSV 导入 ArrayList

mySQL:mysqlimport 导入逗号分隔文件 - 第一列 = ID,不在要导入的文件中

static - 我可以避免在没有 `static mut` 的情况下重新编译我的平台层吗?