首页 > 解决方案 > 嵌套静态类的 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 中是如何工作的(同时忽略通配符导入的有争议的使用)

标签: javajavacinner-classeslanguage-conceptsjavaimports

解决方案


听不懂。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不合格的东西并期望它起作用;除了 * (不包括点)之外,没有任何东西可以编写,因此,星号导入也不会使其工作。


推荐阅读