【发布时间】:2014-01-28 09:38:38
【问题描述】:
我有两个父类和它们的两个子类。我对迭代器方法的返回类型有问题,它总是父类类型,子类不能覆盖它。
请考虑以下代码:
public class Attribute {}
public class Attributes implements Iterable<Attribute> {
protected ArrayList<Attribute> attrs = new ArrayList<Attribute>();
public Iterator<Attribute> iterator() {
return this.attrs.iterator();
}
}
// -------
public class Attr extends Attribute {}
public class Attrs extends Attributes {}
// -------
for (Attr attr : attrs) {
// Error! attrs.iterator() returns Attribute not Attr
}
for (Attribute attribute : attrs) {
Attr attr = (Attr) attribute;
// Works
}
是否可以覆盖迭代器返回类型?
【问题讨论】:
-
基本上将 Collection
转换为 Collection 是行不通的,起初看起来不方便,但如果可以的话,您可以将 Child2 或 Parent 添加到 Collection 当然是 runTimeException -
使用 (Attr) 属性对编译器说“我知道这可能会出错,我知道我在做什么并且我接受我的行为的后果”
-
我知道强制转换是个坏主意,我正在寻找某种方式来覆盖 iterator() 并改变它的行为。
-
<? extends Attribute>也不适用于 iterator() 因为 Iterator(接口)有Iterator<T> iterator()