8

我正在对 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);
    }
}

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

我得到的主要问题是,如果我将通配符*与 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);
    }
}

歧义必须仍然存在。为什么编译没有问题?

4

1 回答 1

6

为什么编译没有问题?

因为Java 语言规范说它确实如此。参见第 6 章和第 7 章,尤其是从 6.4.1 开始:

按需类型导入声明永远不会导致任何其他声明被隐藏。

按需静态导入声明永远不会导致任何其他声明被隐藏。

这可能是因为能够通过通配符导入整个包非常方便,但有时您必须解决冲突。如果唯一的选择是显式导入每个项目,那将会很糟糕(尤其是在 IDE 之前的日子里)。因此,特定(非通配符)导入优先。这样,您只需为要使用的模棱两可的项目指定您的意思。

于 2018-05-29T02:10:17.240 回答