我希望有一个类,其中的一些方法返回不同的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 (比如说Iterable1)提供一个默认的Iterable。我知道我可以让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
诸若此类。不过,我想不出很多模式来实现这一点。
发布于 2014-06-20 17:48:49
您的顶级类需要实现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>();
}
}
发布于 2014-06-20 17:52:17
如果你想让它工作:
MyClass myObject = ...
for (T t : myObject) {
....
那么MyClass
必须实现Iterable<T>
。JLS 14.14.2说:
“表达式的类型必须是可迭代的或数组类型(§10.1),否则会发生编译时错误。”
其中“表达式”指的是myObject
。
我知道我可以让MyClass extend (原文如此)可迭代,并在其中实现默认策略,但我不想这样做,因为我想要一个干净的接口。
抱歉,但这在Java中是不可能的。请参见上面的。
我想在
中使用一些技巧。MyClass扩展了Iterable1或类似的东西。
这实际上等同于让MyClass
实现Iterable
...假设Iterable1
实现了Iterable
。
https://stackoverflow.com/questions/24324238
复制相似问题