我有以下简单的 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 namedn
shadows the declarations of any other methods namedn
that are in an enclosing scope at the point whered
occurs throughout the scope ofd
.
关于java - 当本地定义具有不同参数的函数时,无法调用静态导入的重载函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942059/