[英]Finding all instances of a given class in an array
我有一個程序,我需要在數組中找到類的所有實例。 我想創建一個為我做這個的方法。 例如,如果我有陣列
Object[] arr = {"mystring", new Boolean(false), new Integer(4), new Character('i')}
我用String的參數調用了這個方法(實際上我不確定我的參數的類型應該是什么),它會返回一個{"mystring"}
數組。
我嘗試過類似的東西
public void printInstancesOf(Class c, Object[] array)
{
for (Object obj : array)
{
if (obj instanceof c)
{
System.out.println(obj);
}
}
}
但這甚至都沒有編譯。 有誰知道如何做到這一點? 或者是不可能做到的?
看起來你想要Class.isInstance(Object o) :
確定指定的Object是否與此Class表示的對象分配兼容。 此方法是Java語言instanceof運算符的動態等效項 。 如果指定的Object參數為非null,則該方法返回true,並且可以強制轉換為此Class對象表示的引用類型,而不會引發ClassCastException。 否則返回false。
if (c.isInstance(obj) {
System.out.println(obj);
}
這不起作用,因為它正在測試obj
是文字c
類的instanceof
。 我沒有方便的Java環境,但我相信類似的東西
if (obj.getClass().equals(c)) {
應該做的伎倆。 這可能不適用於子類,但這不應該是一個問題。
編輯:正如其他人所指出的那樣
if (c.isInstance(obj)) {
是更好的選擇
更大的問題是...... 你為什么要這樣做 ? 嘗試模擬Java中的松散類型是一個令人欽佩的目標,但通常是一個非常糟糕的主意。 使用適當的多態性和/或泛型(使用自定義類)。
它看起來不像慣用的Java。 您通常只為特定類構建數組,而不是混合不同的類,如String,Boolean,Integer,Character。
這通常是代碼氣味。
如果你有像這樣的層次結構
AFoo,BFoo,CFoo - >擴展Foo,並將它們放在一個數組中,你會讓它們對一條消息做出顯着反應:
for (Foo foo : foos)
foo.react (param);
然后,AFoos可以以不同於BFoos的方式做出反應。 否則使用instanceof:
for (Foo foo : foos)
if (foo instanceof BFoo)
barDoSomethingWith (foo, param);
你有沒有嘗試過:
private <E> List<E> findInstances(Class<E> type, Object[] arr) {
List<E> instances = new ArrayList<E>();
for(Object o : arr) {
if(type.isInstance(o)) {
instances.add((E)o);
}
}
return instances;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.