【问题标题】:how to use iterable with inheritence如何使用可迭代的继承
【发布时间】:2019-09-14 16:44:47
【问题描述】:

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

我正在尝试在模块A 中迭代包含ActionCardListCards 类,并在模块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&lt;ICard&gt;ArrayList&lt;? extends ICard&gt;
  • 也许不清楚,但 Cards 有很多与我的问题无关的方法和成员,因此它是一个类。
  • 但它仍然只是包装了 ArrayList 的功能。也许拥有Cards extends ArrayList&lt;? extends ICard&gt; 会更容易。这样您就不必重新实现 iterator() 之类的方法以及可能使用的其他一些方法,但这些方法在 ArrayList 实现中可用。

标签: java inheritance iterator wildcard iterable


【解决方案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 类总是创建 ActionCardList 并迭代该 List,因此定义它以实现 ICards&lt;ActionCard&gt; 是有意义的。

由于Cards 实现了ICards,它扩展了Iterable,因此您不必明确声明Cards 实现了Iterable

【讨论】:

  • 首先谢谢,它有效。第二 - 因为我想遍历实现 ICard 的对象集合,所以我使用了约束并将其定义为:public interface ICards&lt;T extends ICard&gt; extends Iterable&lt;T&gt; { // ..some methods }
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2019-12-04
相关资源
最近更新 更多