0

我有CardType1and CardType2that extendsCard和 an Areathat has an ArrayListof Card。这个数组将充满CardType1CardType2对象,但我最终需要像这样访问它们:

for (CardType1 card : this.cards) { ...

概述:

public class Area {

    List<Card> cards = new ArrayList<Card>();
    ..
}

public class Card {..}

public class CardType1 extends Card {..}

public class CardType2 extends Card {..}

如何仅迭代列表中的一个子类型List<Card> cards

4

4 回答 4

3

您不能这样做,因为卡片中对象的类型是Card,而不是CardType1

for(CardType1 card : this.cards){ ...

但是,您可以这样做:

for(Card card : this.cards) {
    if (card instanceof CardType1) {
        CardType1 card1 = (CardType1) card;
        // do something with the card1
    } else {
        CardType2 card2 = (CardType2) card;
        // do something with the card2
    }
 }

我在这里所做的是像你一样遍历卡片(除了我的类型是最通用的类​​型Object)。然后我检查卡片是否是 type CardType1,或者CardType2,使用instanceOf运算符并将其转换为该类型,然后处理它。

于 2012-10-29T23:20:57.390 回答
2

多米尼克和内森的答案是正确的。如果您使用的是 Guava,则可以Iterables.filter(Iterable, Class)用作快捷方式:

for (CardType1 card : Iterables.filter(cards, CardType1.class)) {
    ...
}

从文档中:

type返回 中类的所有实例unfiltered。返回的可迭代对象具有其类type或 的子类的元素type

于 2012-10-29T23:24:00.177 回答
2

您将只能将每个项目作为Card. 如果您能够迭代使用,CardType1那么当您遇到 CardType2 类型的卡片时就会出错。

对于您想要的,您必须检查是否cardCardType1or的实例,CardType2然后card适当地进行转换:

for (Card card : this.cards) {
    if (card instanceof CardType1) {
        CardType1 cardType1 = (CardType1) card;
        // do something with cardType1
    }
    else if (card instanceof CardType2) {
        CardType2 cardType2 = (CardType2) card;
        // do something with cardType2
    }
}
于 2012-10-29T23:20:49.017 回答
0
ArrayList<Card> cards = new ArrayList<>();
cards.add(new CardType1());
cards.add(new CardType2());

for(Card card : this.cards){ 
   // card can be any thing that extends Card. i.e., CardType1, CardType2
   if(card instanceOf CardType1){
       //do cardType1 things
    }
   else if(card instanceof CardType2){
      // do CardType2 things
      }


}
于 2012-10-29T23:21:46.097 回答