我想有一个类,其中一些方法返回不同的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
等等。 但是,我想不出很多可以实现这一目标的模式。
答案 0 :(得分:1)
您的顶级课程需要实施Iterable
。 Iterable
接口定义了一个方法
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
。