访问修饰符错误 - 虽然类是公共的

时间:2017-09-14 07:32:46

标签: java

我有两个类class Aclass B,当我尝试编译这个程序时,我遇到了编译时错误。

  

类型A.C1不可见

package com.abc;

public class A {
    static class C1 {
    }

    public static C1 member = new C1();
}

在包B

中声明的类cde
package com.cde;

import com.abc.A;

public class B {
    public static void main(String[] args) {
        System.out.println(A.member.hashCode());
        System.out.println(((Object)Api.member).hashCode()) //Working fine
    }
}

我的查询是为什么编译失败并出现此错误,因为我的类和变量C1是公共的

PS:我不想更改API - 我知道将C1改为公开将解决我的问题

2 个答案:

答案 0 :(得分:4)

编译器已经说明了问题。

A.C1类型不可见

您可能需要为内部班级public

添加C1
package com.abc;

public class A {
    public static class C1 {
    }

    public static C1 member = new C1();
}

答案 1 :(得分:1)

您需要将C1类的范围更改为public。

public class A {
    public static class C1 {
    }
   ...
}

C1仅对与A1相同的包中的类可见。因此,对于其他包中的类是可见的,您需要更改范围,或创建公开的公共接口/抽象。并且您的实现将保留在包范围内。

根据doc

  

注意:静态嵌套类与其实例成员交互   外部类(和其他类)就像任何其他顶级类一样。   实际上,静态嵌套类在行为上是顶级类   已经嵌套在另一个顶级类中进行打包   便利性。

因此,您的内部类A1.C1的行为与A1类相同,然后是可见性。