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

时间:2014-02-21 18:12:58

标签: 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

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为在您的类中声明的名为g的方法正在按要求隐藏名为g的{​​{1}}方法。见JLS §6.4.1 - Shadowing:

  

名为statically-imported的方法的声明d会影响任何声明   名为n的其他方法,位于该点的封闭范围内   n范围内出现d的地方。