java - 嵌套静态类的 Java 导入通配符可访问性
问题描述
java 可访问性(或者可能是范围)对于类型导入多级嵌套类是如何工作的?一个例子:
类A.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());
}
}
主.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 类型。一个可能类似的问题让我看到了阐明Type-Import-on-Demand 声明的 java 规范表:
按需类型导入声明允许根据需要导入命名包或类型的所有可访问类型。
该问题的公认答案意味着按需进口声明不是递归的。推理可能是 Java 所认为的“命名类型的所有可访问类型”,以及包的一般概念,但我没有连接这些点,也没有理解可访问类型对于嵌套类的含义。
可以请任何人帮助解释类型导入和可访问性在 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
不合格的东西并期望它起作用;除了 * (不包括点)之外,没有任何东西可以编写,因此,星号导入也不会使其工作。
推荐阅读
- c - 指针非法访问 PIC32 上的数组
- java - 如何使用 CardLayout 将 JPanel 从另一个类添加到面板?
- swagger-ui - 如何在 OpenAPI 3.0 中记录 RFC3339 日期时间输入?
- reactjs - 无法设置状态以响应字符串数组
- typescript - 尽管声称 Prettier 不支持私有方法
- angular6 - angular6不刷新css更改
- git - “与您的容器共享 Git 凭据”不起作用
- jenkins - Jenkins 声明式管道 ssh 代理插件
- mysql - NodeJS Mysql pool.query() 没有释放连接?
- python - Django Auth Group 拒绝更改 UpdateViews