我有CardType1
和CardType2
延伸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 {..}
如何在我的List<Card> cards
列表中仅迭代一个的子类型?
答案 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类型的卡时会出现错误。
根据您的需要,您必须检查card
是CardType1
或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
}
}
答案 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
}
}