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

Static import with same static variable names

我正在静态导入 class Long 和 Integer 的成员:

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

现在,如果我尝试使用此变量 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);
    }
}

这很好。要删除错误,我将不得不删除一个静态导入以解决此歧义。

我遇到的主要问题是,如果我将通配符 * 与整数 class 一起使用 静态导入,class 编译时没有错误:

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);
    }
}

歧义肯定还是存在的。为什么编译没有问题?

Why does this compile with no issues?

因为 Java Language Specification 说确实如此。请参阅第 6 章和第 7 章,但特别是从 6.4.1 开始:

A type-import-on-demand declaration never causes any other declaration to be shadowed.

A static-import-on-demand declaration never causes any other declaration to be shadowed.

这可能是因为能够通配符导入整个包非常方便,但有时您必须解决冲突。如果唯一的选择是显式导入每个项目,那将很糟糕(特别是在IDE 天之前)。所以特定的(非通配符)导入被优先考虑。这样,您只需为要使用的模糊项指定您的意思。