假设我们有这些包和类:
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
中的类p2
导入p3
:
package p3;
import p1.A1;
import p2.A1;
此类导入是非法的,将导致编译时错误。
答案 0 :(得分:41)
方法静态导入的模糊性可以在方法调用时解决。
例如,如果您对两个看起来像这样的方法进行了静态导入:
void frobnicate(int i);
// and
void frobnicate(boolean b);
然后你可以导入和使用两者,因为编译器可以根据你传入的参数来判断使用哪一个(frobnicate(1)
调用第一个,frobnicate(true)
调用第二个)。
使用类,这是不可能的:单独Foobar a;
不足以告诉您所需的两个Foobar
类中的哪一个。
另请注意,单静态导入可以导入多个名称。根据{{3}}(强调我的):
单一静态导入声明使用类型中的给定简单名称导入所有可访问的静态成员。
例如,如果上面的两个frobnicate
方法位于同一个类中,则单个static
导入可以同时导入它们。
答案 1 :(得分:2)
这是因为你已经将所有这些类命名为同一个东西。每次调用这个静态方法时,它都会查找最本地的类,在本例中是p3中的A1,它不包含静态方法a()。永远记住,一个类名应该是唯一的,永远不会与另一个相同。
答案 2 :(得分:0)
我猜测,没有语言规范的支持,方法可以重载,但字段/类型不能;因此,java允许从不同的类中导入同名的方法。
但是同一个签名中的两个方法不能存在于同一个类中;他们不应该被进口许可。
即使这两种方法有不同的签名,但仍然是个坏主意。名称的含义非常重要,应该清晰。我们可以处理1个类中的重载方法,但跨类“重载”是一个延伸。