静态导入具有相同的静态变量名称

Nis*_*ngh 8 java compiler-errors wrapper static-import

我正在对Long和Integer类的成员进行静态导入:

import static java.lang.Integer.MAX_VALUE;
import static java.lang.Long.MAX_VALUE;
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用此变量MAX_VALUE并打印它,我将收到一个错误:

import static java.lang.Integer.MAX_VALUE;
import static java.lang.Long.MAX_VALUE;

public class StaticImportDemo2 {
    public static void main(String[] args) {
        //Error :: The field MAX_VALUE is ambiguous 
        System.out.println("Print without static import Integer.MAX_VALUE "+MAX_VALUE);
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以.要删除错误,我将不得不删除一个静态导入来解决这种歧义.

我得到的主要问题是,如果我使用*带有Integer类静态导入的通配符,则编译该类时没有错误:

import static java.lang.System.out;
import static java.lang.Integer.*;
import static java.lang.Long.MAX_VALUE;

public class StaticImportDemo2 {
    public static void main(String[] args) {
        System.out.println("Print without static import Integer.MAX_VALUE " + MAX_VALUE);
    }
}
Run Code Online (Sandbox Code Playgroud)

模棱两可仍然存在.为什么这个编译没有问题?

Bob*_*sen 6

为什么这个编译没有问题?

因为Java语言规范说它确实如此.见第6章和第7章,特别是6.4.1:

类型导入按需声明永远不会导致任何其他声明被遮蔽.

静态导入按需声明永远不会导致任何其他声明被遮蔽.

这可能是因为能够通配符导入整个包非常方便,但有时你必须解决冲突.如果唯一的替代方法是明确导入每个项目,它会很糟糕(特别是在IDE之前的日子里).因此,特定(非通配符)导入优先.这样,您只需指定您想要使用的含糊不清的项目.