【发布时间】:2019-09-14 16:44:47
【问题描述】:
我有两个名为 Cards 和 ActionCard 的类分别实现 ICards 和 ICard,它们包含在两个不同的模块中 - 模块 A 包含 Cards 和 ActionCard 类和依赖于模块B,其中包含ICards 和ICard 接口。
我正在尝试在模块A 中迭代包含ActionCard 的List 的Cards 类,并在模块B 中迭代ICards 接口。
我尝试使用Iterator<ActionCard> iterator() 方法将Cards 类定义为Iterable<ActionCard>,但由于ActionCard 在模块B 中未知,我想将ICards 定义为Iterable<ICard>,即表示Cards 中的方法iterator() 无法返回Iterator<ActionCard>,因为它与Iterator<ICard> 完全不同(我不想在模块A 中更改为ICard,因为我需要工作ActionCard)。
我尝试使用通配符在Cards 类中定义Iterable<? extends ICard>,但它给出了错误:
不需要通配符
当我尝试在该类中定义方法 Iterator<? extends ICard> iterator() 时,它会给出错误:
Cards 中的iterator() 与 java.lang.iterable 中的 iterator() 冲突;试图使用不兼容的返回类型。
//Module A:
public class Cards implements ICards, Iterable<? extends ICard> {
private List<ActionCard> m_Cards = new ArrayList<>();
@Override
public Iterator<? extends ICard> iterator(){
return m_Cards.iterator();
}
}
public class ActionCard implements ICard {
//...some methods
}
//Module B:
public interface ICards extends Iterable<? extends ICard> {
//...some methods
}
public interface ICard {
//...some methods
}
有什么方法可以实现我的目标吗?
【问题讨论】:
-
我不明白你为什么要为 ArrayList 创建
Cards包装器。为什么不直接使用ArrayList<ICard>或ArrayList<? extends ICard>? -
也许不清楚,但 Cards 有很多与我的问题无关的方法和成员,因此它是一个类。
-
但它仍然只是包装了 ArrayList 的功能。也许拥有
Cards extends ArrayList<? extends ICard>会更容易。这样您就不必重新实现iterator()之类的方法以及可能使用的其他一些方法,但这些方法在 ArrayList 实现中可用。
标签: java inheritance iterator wildcard iterable