如何在继承中使用可迭代的方法

时间:2019-04-25 09:33:46

标签: java inheritance iterator wildcard iterable

我有两个分别名为CardsActionCard的类,分别实现ICardsICard,它们分别包含在两个不同的模块中-模块A包含CardsActionCard类,并依赖于模块B,该模块包含ICardsICard接口。

我正在尝试遍历模块Cards中包含List的{​​{1}}的{​​{1}}类,并遍历模块中的ActionCard接口A

我尝试使用方法ICardsB类定义为Cards,但是由于Iterable<ActionCard>在模块Iterator<ActionCard> iterator()中是未知的,所以我想将ActionCard定义为B,这意味着ICards中的方法Iterable<ICard>无法返回iterator(),因为它是与Cards完全不同的类型(而且我不想在模块Iterator<ActionCard>中更改为Iterator<ICard>,因为我需要使用ICard)。

我尝试使用通配符在A类中定义ActionCard,但出现错误:

  

不希望使用通配符

,当我尝试在该类中定义方法Iterable<? extends ICard>)时,出现错误:

  Cards中的

iterator()与java.lang.iterable中的iterator()冲突;尝试使用不兼容的返回类型。

Cards

有什么办法可以实现我的目标?

1 个答案:

答案 0 :(得分:1)

怎么样:

public interface ICards<T> extends Iterable<T> {
  // ..some methods
}

public class Cards implements ICards<ActionCard> {

    private List<ActionCard> m_Cards = new ArrayList<>();

    @Override
    public Iterator<ActionCard> iterator()
    {        
        return m_Cards.iterator();
    }
}

由于您的Cards类总是创建List的{​​{1}}并在ActionCard上进行迭代,因此定义它来实现List是有意义的。 / p>

并且由于ICards<ActionCard>实现了Cards(扩展了ICards),因此您不必明确声明Iterable实现Cards