具有各种类型对象的Java ArrayList

时间:2012-10-29 23:16:19

标签: java list iteration

我有CardType1CardType2延伸CardAreaArrayList卡。这个数组将填充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 个答案:

答案 0 :(得分: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之外我的类型是两者中最常用的类型)。然后,我使用CardType1运算符检查该卡是CardType2类型还是instanceOf,并将其转换为该类型,然后处理它。

答案 1 :(得分:2)

您只能以Card的形式遍历每个项目。如果您能够使用CardType1进行迭代,那么当您遇到CardType2类型的卡时会出现错误。

根据您的需要,您必须检查cardCardType1CardType2的实例,然后恰当地投射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
    }
}

答案 2 :(得分:2)

Dominic和Nathan的回答是正确的。如果您使用的是Guava,则可以使用Iterables.filter(Iterable, Class)作为快捷方式:

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

来自文档:

  

返回type中所有类unfiltered的实例。归来了   iterable具有类为type的子元素或type的子类。

答案 3 :(得分: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
      }


}