Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';当本地定义了具有不同参数的函数时,是否调用静态导入的重载函数?_Java_Import_Static_Overloading_Adhoc Polymorphism - Fatal编程技术网

Java Can';当本地定义了具有不同参数的函数时,是否调用静态导入的重载函数?

Java Can';当本地定义了具有不同参数的函数时,是否调用静态导入的重载函数?,java,import,static,overloading,adhoc-polymorphism,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.print

我有以下简单的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
的方法,该方法是按需静态导入的。看

名为
n
的方法的声明
d
会隐藏任何 位于该点封闭范围内的名为
n
的其他方法 其中
d
出现在
d
的整个范围内


有什么办法可以解决吗?也就是说,使用本地方法和导入方法进行重载工作?@Dog使用完全限定名。不要静态导入它。这是唯一的办法。