【问题标题】:Default Iterable plus other Iterable默认 Iterable 加上其他 Iterable
【发布时间】:2014-08-11 00:47:02
【问题描述】:

我想要一个类,其中一些方法返回不同的 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

等等。 不过,我想不出很多模式来实现这一点。

【问题讨论】:

    标签: java iterator iterable


    【解决方案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>();
      }
    
    }
    

    【讨论】:

    • 我正在考虑使用扩展的一些技巧。 MyClass 扩展了 Iterable1 或类似的东西。
    【解决方案2】:

    如果你想让它工作:

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

    那么MyClass 必须实现Iterable&lt;T&gt;JLS 14.14.2 说:

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

    其中“表达式”指的是myObject


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

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


    我正在考虑使用扩展的一些技巧。 MyClass 扩展了 Iterable1 或类似的东西。

    这实际上与让MyClass 实现Iterable 相同...假设Iterable1 实现Iterable

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 2010-11-06
      • 2020-08-13
      • 2012-01-04
      • 1970-01-01
      • 2016-05-07
      • 2021-09-14
      • 2010-11-07
      • 2011-07-26
      相关资源
      最近更新 更多