0
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) 是不是因为我实现了一个从可迭代扩展的接口?

(2) 我的私有变量是集合和列表——它们有自己的迭代器,我不需要定义任何新的迭代器——那我该怎么办?我应该删除遗产吗?

(3) 我们什么时候需要定义一个新的迭代器?当我们定义一个类时,它对我们来说是一种集合?但我想知道为什么,因为我们总是使用通用集合,它们有自己的迭代器..你能给我举个例子吗?

(4) 如果我添加到一组集合 anew HashSet<T>()你会认为它添加一个空列表还是添加new HashSet().add(null)将被视为一个空列表?

4

2 回答 2

2

(1) 是不是因为我实现了一个从可迭代扩展的接口?

是的,你得到了这个iterator()方法,因为你的接口扩展了Iterable。这意味着任何实现你的接口的类也必须实现所有的方法Iterable。如果您不想要那个,请不要扩展Iterable.

(2) 我的私有变量是集合和列表——它们有自己的迭代器,我不需要定义任何新的迭代器——那我该怎么办?我应该删除遗产吗?

您的私有成员对您的类的消费者不可用,因此您需要一种方法来公开这些迭代器。你如何做到这一点取决于你,但通过你的iterate()方法这样做很有意义。

(3) 我们什么时候需要定义一个新的迭代器?当我们定义一个类时,它对我们来说是一种集合?但我想知道为什么,因为我们总是使用通用集合,它们有自己的迭代器..你能给我举个例子吗?

如果您创建自己的集合并希望可迭代,但不扩展已经实现的集合Iterable,那么您需要创建自己的迭代器。如果您不在乎,则没有必要,尽管您的消费者可能会有不同的感受。

于 2011-09-06T15:57:55.083 回答
0

(1) 是的,因为PowerList<T> implements IPowerList<T>,它必须实现Iterator<T> iterator()(或返回 的子类型Iterator<T>)。

(2) 将继承留给Iterable<T>,这样您就可以封装您的字段(无论如何它们都是私有的)并且只导出一个迭代器。其次,你可以决定你导出哪个和什么样的Iterator,并且在未来更加灵活(例如改变枚举的顺序)。最后,如果 IPowerList 与迭代无关(在我看来是这样),您可以考虑不为 IPowerList 扩展 Iterable,而是让 PowerList 实现两个接口(Java 中允许接口上的多重继承)。

(3) 例如,当您编写一个新集合时,例如您的集合。或者当您想要更改迭代器的行为方式时,例如枚举顺序或迭代器是否可以添加和删除元素。例如,我有一个树形结构,它可以返回一堆不同的迭代器(并实现了 Iterator 和几个类似的接口)。

于 2011-09-06T16:04:55.777 回答