【问题标题】:Implementing Iterable with a nested class in Java在 Java 中使用嵌套类实现 Iterable
【发布时间】:2012-07-09 16:33:29
【问题描述】:

这是我的代码:

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 类移到单独的文件中,因为这需要将该类的许多内部工作暴露给包中的所有其他类。

我的问题是:为什么不能编译?而且,解决这个问题的最佳方法是什么?

【问题讨论】:

  • 如何使用ItemList
  • 尝试将Entry类设为静态。
  • 这个结构在直觉上是没有意义的。您正在实现私有类型的Iterable。外部课程如何在不知道Entry 的情况下使用您的ItemList
  • 现在,我使用 c# 而不是 java,但在我看来 ItemList 不能真正实现 Iterable&lt;Entry&gt;,只要 Entry 是私有的。只是没有意义。
  • @SamIam ItemList 只是列表的包装器。基本上,我想阻止其他类使用某些 List 功能。

标签: java generics iterator


【解决方案1】:

问题在于范围界定。由于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();
    }
}

【讨论】:

  • 非常感谢,就是这样。我不敢相信我没有想到这一点!
【解决方案2】:

Entry 是一个私有类,因此其他类将无法看到它。您可以将其公开,但仍保持嵌套。

它也应该是静态的,因为它不依赖于外部类的任何状态。

【讨论】:

  • 即使使用Entry public static,仍然会出现编译错误。
  • 请原谅我的无知,但Entry 似乎打算成为一个可实例化的类。 static 类在 java 中可以实例化吗?
  • 当然,静态类只是意味着它不需要外部类的实例。
  • 参见@Tudors 的回答。它是正确的。我错过了泛型参数不包含外部类名的事实。
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2011-02-15
相关资源
最近更新 更多