默认Iterable加上其他Iterable

时间:2014-06-20 09:37:28

标签: java iterator iterable

我想有一个类,其中一些方法返回不同的Iterable,如下所示:

public class MyClass<T extends Comparable<T>> {
  ...

  public Iterable<T> iterable1() {
    return new Iterable1<T>();
  }

  public Iterable<T> iterable2() {
    return new Iterable2<T>();
  }

  public Iterable<T> iterable3() {
    return new Iterable3<T>();
  }

}

但我也想要MyClass类的默认Iterable(让我们说Iterable1)。 我知道我可以使MyClass扩展Iterable并在其中实现默认策略,但我不想这样做,因为我想要一个干净的界面。

我希望能写下来:

for(T t : myClass) //Here it should use Iterable1
  //do something

for(T t : myClass.iterable1()) //Here it should use Iterable1 again
  //do something

for(T t : myClass.iterable2()) //Here it uses Iterable2
  //do something

等等。 但是,我想不出很多可以实现这一目标的模式。

2 个答案:

答案 0 :(得分:1)

您的顶级课程需要实施IterableIterable接口定义了一个方法

Iterator<T> iterator();

将在您的情况下提供“默认”迭代器。

你的课程需要看起来像这样:

public class MyClass<T extends Comparable<T>> implements Iterable<T> {
  ...

  Iterator<T> iterator() {
    return new Iterable1<T>().iterator();
  }

  public Iterable<T> iterable1() {
   return new Iterable1<T>();
  }

  public Iterable<T> iterable2() {
   return new Iterable2<T>();
  }

  public Iterable<T> iterable3() {
   return new Iterable3<T>();
  }

}

答案 1 :(得分:1)

如果你想要这个:

    MyClass myObject = ...
    for (T t : myObject) {
          ....

然后MyClass 必须实施Iterable<T>JLS 14.14.2说:

  

“Expression的类型必须是Iterable或数组类型(第10.1节),否则会发生编译时错误。”

其中“表达式”指的是myObject


  

我知道我可以使MyClass扩展(原文如此)Iterable并在其中实现默认策略,但我不想这样做,因为我想要一个干净的界面。

抱歉,但这在Java中是不可能的。见上文。


  

我在考虑使用扩展功能。 MyClass扩展了Iterable1或类似的东西。

这与使MyClass实施Iterable实际上相同......假设Iterable1实施Iterable