我的代码引起了我的注意。我该如何简化它?
abstract class A {}
class B extends A { //generated by Velocity
static public Iterator<B> iterator() {...}
}
class C extends A { //generated by Velocity
static public Iterator<C> iterator() {...}
}
用法:
for (Iterator<B> i = B.iterator(); i.hasNext();) {
sout(i.next().toString());
}
for (Iterator<C> i = C.iterator(); i.hasNext();) {
sout(i.next().toString());
}
有没有办法让我创建一些方法,将Class扩展A迭代它?优先不改变类生成逻辑。
答案 0 :(得分:1)
首先你可以重新定义你的A类并在那里添加itterator
abstract class A<T extends A> {
public Iterator<T> iterator() {...}
}
如果需要,这个方法是抽象的;
然后,您需要更改班级class B extends A<B>
和class C extends A<C>
另外,将代码复制到使用迭代器的位置,可以将其包装到方法
中public <T extends A<?>> void itterate(Iterator<T> itr) {
for (Iterator<T> i = itr; i.hasNext();) {
sout(i.next().toString());
}
}
然后你来吧
itterate(b.iterator());
itterate(c.iterator());
答案 1 :(得分:1)
绝对有可能不触及A,B和C:
public static void doSomething(Iterator<? extends A> it) {
while (it.hasNext()) {
sout(it.next().toString));
}
}
然后致电:
B b = ... ; // Retrieve an instance of B
C c = ... ; // Retrieve an instance of C
doSomething(b.iterator());
doSomething(c.iterator());
记住您的编辑(iterator()
成为static
),您可以保留我写的方法而不会改变任何内容。然而,呼叫改变如下:
// Don't create instances anymore.
doSomething(B.iterator());
doSomething(B.iterator());