2017-09-14 64 views
-1

我有兩個類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 is public

PS:我不想更改API - 我知道將C1更改爲公開將修復我的問題

+0

你的班級'C1' *不公* – EJP

+0

在Eclipse中嘗試了相同的代碼,通過將'static class C1'聲明爲'public'解決了這個問題。 – procrastinator

+0

@ EJP-你爲什麼要我改變API。我編輯了這個問題併發布了答案,請分享您的輸入 –

回答

4

編譯器已經說明了問題。

類型A.C1是不可見的

您可能需要添加public您的內部類C1

package com.abc; 

public class A { 
    public static class C1 { 
    } 

    public static C1 member = new C1(); 
} 
+0

請 - 檢查JSL公共訪問修飾符。 –

+1

@LoneWolf自己檢查一下。這個答案是正確的。你的觀點? – EJP

+0

@ EJP-請檢查我的答案,這就是我爲什麼在尋找 –

1

您需要更改類C1的範圍公開。

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

C1只對與A1相同的包中的類可見。因此,對於其他包中的類可見,您需要更改範圍,或者創建一個公共接口/抽象。你的實現將保持在包的範圍內。

按照doc

注:靜態嵌套類及其 外類的實例成員(和其它類),就像任何其他頂層類交互。 實際上,靜態嵌套類在行爲上是頂級類 ,它已嵌套在另一個頂級類中以便打包 。

因此,您的內部類A1.C1的行爲與A1類相同,然後它的可見性。