2012-07-09 67 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