2013-09-21 73 views
1

我有具有內類訪問內部類從其它類

public class A { 
    public class NameComparator implements Comparator<A> { 
     @Override 
     public int compare(A o1, A o2) { 
     return o1.name.compareToIgnoreCase(o2.name); 
     } 
    } 
... 
} 

該類我想從另一個C類訪問此NameComparator類(駐留在另一個包比A)。

實施例(從C):

Collections.sort(aArrayList,A.new NameComparator());

這不起作用。我應該移動內部類NameComparator,以便它不被包含在類A中並將其重命名爲類似於ANameComparator的東西?他們是緊密相關的,所以感覺彆扭不是A級

+2

使'NameComparator'成爲'static'類。 –

+0

或者使用A的實例來創建NameComparator的實例。 –

+1

你需要一個實例。 'new A()。new NameComparator()' – nachokk

回答

5

如果你想用你這樣的代碼中把這個功能,你需要有內部類的靜態:

public class A { 
    public static class NameComparator implements Comparator<A> { 
     @Override 
     public int compare(A o1, A o2) { 
     return o1.name.compareToIgnoreCase(o2.name); 
     } 
    } 
    ... 
} 

爲什麼?因爲如果不標記內部類是靜態的,它只對外部類的實例有效。

你必須實例比較像這樣代爾鋁-Zour使用情況下使用:

Collections.sort(aArrayList,new A.NameComparator()); 
+0

當我嘗試這個時,我的編譯器報告類C的下列問題: Collections.sort(aArrayList,A.new NameComparator()); 「A無法解析爲變量」。 – nize

+1

@nize我更新了答案,沒有發現那裏的語法... – ppeterka

1

您有2個選項。

將您的內部類爲靜態嵌套類

public static class NameComparator implements Comparator<A> 

而且在C

Collections.sort(aArrayList,new A.NameComparator()); 

或者,如果你不想修改內部類就是創建A一個實例。

Collections.sort(aArrayList,new A().new NameComparator()); 
+0

第二個替代工作,但當嘗試第一個替代(靜態)看起來「更好」我想,我得到了評論中描述的錯誤到下面的ppeterka。 – nize

+2

我wouldnt使內部類公開,但這是一個設計決定,你有一個語法錯誤,這就是爲什麼不編譯! – nachokk

+0

你會如何解決它?額外的外部課程?你如何以合理的方式捆綁功能? – nize