微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

嵌套静态类的 Java 导入通配符可访问性

如何解决嵌套静态类的 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 举报,一经查实,本站将立刻删除。