簡體   English   中英

查找數組中給定類的所有實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM