嵌套静态类的 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 并期望它起作用;没有什么可以代替 *(不包括点)来编写的,因此,星形导入也不能使其工作。