public interface IPowerList<T> extends Iterable< T > {
public int bitFlag(List<T> subseq);
}
public class PowerList<T> implements IPowerList<T>{
private List<T> originalList;
private Set<Set<T>> powerList= new HashSet<Set<T>>();
@Override
public Iterator<T> iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public int bitFlag(List<T> subseq) {
// TODO Auto-generated method stub
return 0;
}
}
Eclipse自动给我实现iterator
的覆盖方法。
(1)是因为我实现了一个从iterable扩展的接口吗?
(2)我的私有变量是集合和列表 - 它们有自己的迭代器,我不需要定义任何新的迭代器 - 所以我该怎么办?我应该删除继承吗?
(3)我们什么时候需要定义一个新的迭代器?当我们定义一个类,它是我们的集合?但我想知道为什么,因为我们总是使用一个通用的集合,它们有自己的迭代器。你能给我一个例子吗?
(4)如果我添加一组new HashSet<T>()
,您会考虑添加空列表,还是添加new HashSet().add(null)
会被视为空列表?
答案 0 :(得分:2)
(1)是因为我实现了一个从iterable扩展的接口吗?
是的,您获得了iterator()
方法,因为您的界面扩展了Iterable
。这意味着任何实现接口的类都必须实现Iterable
的所有方法。如果您不想这样做,请不要展开Iterable
。
(2)我的私有变量是集合和列表 - 它们都有自己的变量 迭代器,我不需要定义任何新的迭代器 - 所以我该怎么做 做?我应该删除继承吗?
您的私有成员不可用于您的类的使用者,因此您需要一种方法来公开这些迭代器。你如何做到这一点取决于你,但通过你的iterate()
方法这样做很有意义。
(3)我们什么时候需要定义一个新的迭代器?当我们定义一个类 它对我们来说是一种收藏?但我想知道为什么,因为我们总是 使用通用集合,它们有自己的迭代器。你可以给 我举个例子?
如果您创建自己想要可迭代的集合,但这不会扩展已经实现Iterable
的集合,那么您将需要创建自己的迭代器。如果你不在乎,那就没有必要了,尽管你的消费者可能会有不一样的感受。
答案 1 :(得分:0)
(1)是,自PowerList<T> implements IPowerList<T>
起,它必须实施Iterator<T> iterator()
(或返回Iterator<T>
的子类型。)
(2)将继承保留为Iterable<T>
,这样就可以封装你的字段(它们都是私有的)并且只导出Iterator。其次,您可以决定导出哪个和哪种迭代器,并且将来更灵活(例如,更改枚举的顺序)。最后,如果与Iterations无关(在我看来就是这样),你可以考虑不为你的IPowerList扩展Iterable,而是让PowerList实现两个接口(在Java中允许在接口上进行多重继承)。
(3)例如,当你撰写一个新的收藏品时,例如你的一套。或者当您想要改变迭代器的行为方式时,例如枚举的顺序或迭代器是否可以添加和删除元素。例如,我有一个树结构,可以返回一堆不同的迭代器(并实现Iterator和几个类似的接口)。