[英]In Java, how can I check if a collection contains an instance of a specific class?
例如(這是非常簡化的),假設我有一張卡片中的每張卡片的類......例如KingOfSpaces
類, QueenOfSpades
類, JackOfDiamonds
類等等。所有這些都擴展了Card
。 KingOfSpaces
可能有多個實例。
我有一個ArrayList<Card>
,里面有5個對象。 如何查看該ArrayList
包含至少一個AceOfDiamonds
?
讓我們首先指出,使用類進行這種區分幾乎肯定是一件壞事。 我要說你可能需要讓'Card'更聰明一些(即使用getSuit()和getOrdinal()方法)。
但是,如果你堅持這樣做,迭代數組列表(你可以google - 這是一個非常基本的東西)並使用instanceof運算符比較列表中的每個條目。
您將此問題標記為與“反射”有關,這似乎並不正確。 你確定你不打算把它作為“家庭作業”嗎?
好的 - 到底是什么,這是代碼:
List<Card> hand = ...;
for(Card card : hand){
if (card instanceof AceOfDiamonds) return true;
}
但請不要設置你的班級層次結構 - 這是一個可怕的設計。
試試instanceof運算符:
if (myObject instanceof myType) {
System.out.println("myObject is an instance of myType!");
}
@Daniel Pereira按要求回答了這個問題。 我想提出你真正想要的是一個enum
。
例子:
enum Card {
KingOfSpades,
QueenOfSpades,
JackOfSpades,
// etc
AceOfDiamonds;
}
Card myCard = ...;
if(myCard == Card.KingOfSpades) {
// stuff
}
Set<Card> cards = new EnumSet<Card>(Card.class);
cards.add(...);
if(cards.contains(myCard)) {
// stuff
}
你可以像這樣擴展List:
public class XList<T> extends ArrayList {
public boolean hasInstanceOf(Object obj) {
for (Class<?extends Object> item: (Collection<Class<? extends Object>>)this ) {
if (item.isInstance(obj)) return true;
}
return false;
}
}
此解決方案允許您,您可以動態檢查類型而不是僅靜態類型。
你可以像這樣實現List:
xList<Class> classTypes = new xList<Class>();
if (classTypes.hasInstanceOf(item.getClass())){
return true;
}
您可以使用以下代碼:
private boolean findInstance(ArrayList items, String className) {
boolean tag = false;
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getClass().getName().equals(className)) {
tag = true;
break;
}
}
return tag;
}
'className'包含包名,例如:'java.lang.String'
public static <E> boolean containsInstance(List<E> list, Class<? extends E> clazz) {
for (E e : list) {
try {
List<E> list2 = (List<E>) e;
for (E list21 : list2) {
System.out.println("<< ENCONTRO LISTA DENTRO DEL ARRAY DE OBJETOS >> ");
if (clazz.isInstance(list21)) {
return true;
}
}
} catch (Exception q) {
System.out.println("<< ENCONTRO OBJETO DENTRO DEL ARRAY DE OBJETOS >> ");
if (clazz.isInstance(e)) {
return true;
}
continue;
}
}
return false;
}
檢查對象的類型實質上違反了各種面向對象的原則。 您可能想要回答的問題是,一旦找到該類型的對象,您打算做什么。
要執行的動作是必須為每種類型建模的動詞。 例如,在單人紙牌游戲中,當你點擊一張牌時,你可以把它放在右側的籌碼上。 因此,卡是否可以落在堆棧上的能力取決於對象本身,因為它知道它的身份。 所以基本上你必須為每張卡實現一個deal()方法,並根據它的對象,它知道如何為它的實例實現deal()。 通過在對象外部進行(並檢查類型),您實際上已經破壞了封裝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.