0

私は持っていてCardType1CardType2それは拡張Cardし、そしてそれはカードのAreaを持っています。ArrayListこの配列はオブジェクトで埋められCardType1ますCardType2が、最終的には次のようにそれらにアクセスする必要があります。

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 {..}

リスト内のサブタイプの1つだけを反復処理するにはどうすればよいですか?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です)。次に、演算子を使用してカードのタイプが、、CardType1またはであるかどうかを確認し、そのタイプにキャストしてから処理します。CardType2instanceOf

于 2012-10-29T23:20:57.390 に答える
2

各アイテムを。としてのみ繰り返すことができますCard。使用を繰り返すことができた場合CardType1、CardType2タイプのカードに遭遇したときにエラーが発生します。

必要なものについては、またはcardのインスタンスであるかどうかを確認してから、適切にキャストする必要があります。CardType1CardType2card

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 に答える
2

ドミニクとネイサンの答えは的を射ている。Guavaを使用している場合Iterables.filter(Iterable, Class)は、ショートカットとして使用できます。

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

ドキュメントから:

type内のクラスのすべてのインスタンスを返しますunfiltered。返されるiterableには、クラスがtypeまたはのサブクラスを持つ要素が含まれていtypeます。

于 2012-10-29T23:24:00.177 に答える
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 に答える