30

假设我们有这些包和类:

package p1;

public class A1 {
    public static void a() {}
}

package p2;

public class A1 {
    public static void a() {}
}

package p3;

import static p1.A1.a;
import static p2.A1.a;

public class A1 {
    public static void test() {

    }
}

我想知道,为什么方法的静态导入在包中是合法的(不会导致编译时错误)p3?我们将无法在test()方法中进一步使用它们,因为这样的使用会导致编译时错误。

为什么它与正常的类导入不同。假设我们想将类A1从包导入p1到:p2p3

package p3;
import p1.A1;
import p2.A1;

这样的导入是非法的,会导致编译时错误。

4

3 回答 3

44

方法的静态导入的歧义可以在方法调用时解决。

例如,如果您有两个方法的静态导入,如下所示:

void frobnicate(int i);
// and
void frobnicate(boolean b);

然后你可以导入和使用两者,因为编译器可以根据你传入的参数来判断使用哪个(frobnicate(1)调用第一个,frobnicate(true)调用第二个)。

对于课程,这是不可能的:Foobar a;仅凭这两个课程不足以告诉您Foobar您想要两个课程中的哪一个。

另请注意,单个静态导入可以导入多个名称。根据JLS 的相关部分(强调我的):

单静态导入声明从类型中导入具有给定简单名称的所有可访问静态成员。

例如,如果frobnicate上面的两个方法位于同一个类中,则单个static导入可以将它们都导入。

于 2012-10-22T10:37:15.890 回答
2

这是因为您将所有这些类命名为相同的东西。每次调用此静态方法时,它都会查找最本地的类,在本例中是 p3 中的 A1,它不包含静态方法 a()。永远记住一个类名应该是唯一的,并且永远不能与另一个相同。

于 2012-10-22T10:36:59.633 回答
0

我猜,不受语言规范支持,方法可以重载,但字段/类型不能;因此 java 允许从不同的类中导入同名的方法。

但是,同一类中不能存在两个相同签名的方法;进口也不应该允许它们。

即使这两种方法有不同的签名,这仍然是一个坏主意。一个名字的含义很重要,它应该是清晰的。我们可以处理来自 1 个类的重载方法,但是跨类的“重载”是一种延伸。

于 2012-10-22T15:26:19.090 回答