如何解决嵌套静态类的 Java 导入通配符可访问性
java 可访问性(或范围)如何与类型导入多级嵌套类相关?一个例子:
ClassA.java:
package com.oracle.javatests;
public class ClassA {
public static class nestedAA {
public void printSomething() {
System.out.println("inside " + this.getClass().getName());
}
public static class nestedAB{
public void printSomethingAB() {
System.out.println("inside " + this.getClass().getName());
}
}
}
public void printSomething() {
System.out.println("inside " + this.getClass().getName());
}
}
Main.java
package com.oracle.javatests;
import com.oracle.javatests.ClassA.*;
// import com.oracle.javatests.ClassA.nestedAA.*; // Adding this will resolve nestedAB
public class Main {
public static void main (String[] args){
ClassA objA = new ClassA();
objA.printSomething();
nestedAA nestedAA = new nestedAA(); // Ok
nestedAB nestedAB = new nestedAB(); // Compiler error- nestedAB cannot be resolved to a type
}
}
import 语句在使用通配符时不会导入 nestedAB 类型。一个可能类似的 question 使我看到了阐明 Type-Import-on-Demand Declarations 的 java 规格表:
按需类型导入声明允许所有可访问的类型 根据需要导入的命名包或类型。
该问题的公认答案意味着按需导入声明不是递归的。原因可能是 Java 认为“命名类型的所有可访问类型”和 general concept of packages,但我没有把点联系起来,也没有理解可访问类型对于嵌套类的含义。
请任何人帮助解释类型导入和可访问性在 java 中的工作原理(同时忽略通配符导入的有争议的使用)
解决方法
没听懂。 import static com.foo.bar.*;
与 import static com.foo.bar.[everything you can imagine here but without dots]
完全相同。
换句话说,在您的示例中,使用 import static pkg.ClassA.*;
,您可以只编写没有限定符的 NestedAA
并且有效,因为 import static pkg.ClassA.NestedAA;
会使该工作完全相同。
您不能编写不合格的 NestedAB
并期望它起作用;没有什么可以代替 *(不包括点)来编写的,因此,星形导入也不能使其工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。