2012-07-09 64 views
4

嵌套類下面是我的代碼:實現可迭代在Java

import java.util.List; 

public class ItemList implements Iterable<Entry> { 
    private List<Entry> entries; 

    public static class Entry { 
     private final String id; 
     private int quantity; 
    } 

    @Overide public Iterator<Entry> iterator() { 
     return entries.iterator(); 
    } 
} 

該代碼將無法編譯。 (它聲稱它無法在ItemList類定義中找到「Entry」類型)。

我希望其他類能夠遍歷此列表的內部條目。我寧願不將Entry類移動到單獨的文件中,因爲這需要將該類的許多內部運作暴露給包中的所有其他類。

我的問題是:爲什麼不能編譯?而且,解決這個問題的最好方法是什麼?

+0

如何使用ItemList? – 2012-07-09 16:37:01

+2

試着讓'Entry'類成爲靜態的。 – 2012-07-09 16:37:56

+0

這種結構直觀上沒有意義。你正在實現一個私有類型的'Iterable'。外部類如何在不知道Entry的情況下使用你的ItemList? – Tudor 2012-07-09 16:40:39

回答

9

問題是範圍界定。由於Entry是一個內部類,它需要以「父」的名稱作爲前綴。試試這個:

class ItemList implements Iterable<ItemList.Entry> { 

    private List<Entry> entries; 

    public static class Entry { 
     private final String id = null; 
     private int quantity;  
    } 

    @Override public Iterator<Entry> iterator() { 
     return entries.iterator(); 
    } 
} 
+0

非常感謝,就是這樣。我不敢相信我沒有想到! – jareds 2012-07-09 16:48:53

1

條目是一個私人類,所以其他類將無法看到它。你可以公開它,但仍然保持它的嵌套。

它也應該是靜態的,因爲它不依賴於外部類的任何狀態。

+2

即使使用公共靜態,您仍然會收到編譯錯誤。 – jareds 2012-07-09 16:42:12

+0

你可以發佈全班嗎? – 2012-07-09 16:43:11

+0

請原諒我對我的無知,但'Entry'似乎打算成爲一個實例類。在java中是靜態類instanceable? – 2012-07-09 16:43:31