2012-06-20 66 views
2

我有一個程序,我需要在數組中找到類的所有實例。我想創建一個方法來爲我做這個。舉例來說,如果我有陣列查找數組中給定類的所有實例

Object[] arr = {"mystring", new Boolean(false), new Integer(4), new Character('i')} 

,我稱這種方法與字符串的參數(我不知道我的參數的類型應該是什麼,實際上),它將返回的{"mystring"}數組。

我試過的東西

public void printInstancesOf(Class c, Object[] array) 
{ 
    for (Object obj : array) 
    { 
     if (obj instanceof c) 
     { 
      System.out.println(obj); 
     } 
    } 
} 

但是,這並不編譯。有誰知道如何做到這一點?或者是不可能做到的?

+0

你想對這些實例做什麼?只需打印它們? – Jeshurun

+0

可能的重複[在Java中是否有類似instanceOf(類 c)?](http://stackoverflow.com/questions/949352/is-there-something-like-instanceofclass-c-in-java) –

回答

6

看起來像你想Class.isInstance(Object o)

確定指定的對象是賦值兼容與此Class所表示的對象。 此方法與Java語言instanceof運算符的動態等效。如果指定的Object參數非空並且可以轉換爲由此Class對象表示的引用類型而不引發ClassCastException,則該方法返回true。否則返回false。

if (c.isInstance(obj) { 
    System.out.println(obj); 
} 
+1

或者,你可以通過嘗試使用try {c.cast(obj);)來檢測子類。 System.out.println(obj); } catch(ClassCastException e){}' – Wug

+0

太好了!這工作。非常感謝您的快速響應。 – ucarion

2

這不起作用,因爲它正在測試如果objinstanceof字面值c類。我沒有Java環境方便,但我相信像

if (obj.getClass().equals(c)) { 

應該做的伎倆。這可能不適用於子類,但這不應該成爲一個問題。

編輯:正如其他人指出

if (c.isInstance(obj)) { 

是更好的選擇

更大的問題是... 你爲什麼這樣做?試圖模擬Java中的寬鬆打字是一個令人欽佩的目標,但通常是一個非常糟糕的主意。改用適當的多態性和/或泛型(用自定義類)。

0

你試過:

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; 
} 
1

它看起來並不像Java習慣。你通常只會爲特定的類構建數組,而不是混合不同的類,如String,Boolean,Integer,Character。

這通常是一種代碼味道。

如果你有一個像

層次

AFoo,BFoo,Cfoo的 - >擴展符,並讓他們在一個數組,你會讓他們顯著反應的消息:

for (Foo foo : foos) 
    foo.react (param); 

AFoos可能然後以另一種方式反應而不是BFoos。否則使用instanceof:

for (Foo foo : foos) 
    if (foo instanceof BFoo) 
     barDoSomethingWith (foo, param); 
相關問題