2012-11-09 64 views
14

我試圖寫一個方法返回匹配它會作爲參數的類的所有對象:的instanceof類<?>參數

public class Scenario extends View { 

    ... 

    private Actor[] actors = new Actor[1024]; 

    ... 

    public Actor[] getActors(Class<?> cls) { 
     //Count actors corresponding to class cls 
     int cnt = 0;  
     for (int i = 0; i<actorsCount; i++) 
      if (actors[i] instanceof cls) cnt++; 


     //Build a new array; 
     Actor[] clsActors = new Actor[cnt]; 

     //Fill it 
     for (int j = 0, k=0; j<cnt; k++) 
      if (actors[k] instanceof cls) 
       clsActors[j++] = actors[k]; 

     return clsActors; 
    } 
} 

不過,我得到一個錯誤:「 - 數不兼容類型布爾值和Class

'Actor'由我的小精靈擴展,比如Bird,Hero等。 這個想法是,例如,獲取所有的列表場景中的鳥在特定時間進行一些計算。

任何想法這裏發生了什麼?如何測試給定對象是否是給定類的實例?

回答

26
import java.util.Arrays; 

public class Main 
{ 
    static class Actor {} 
    static class Frog extends Actor {@Override public String toString() {return "I'm a frog";}} 
    static class Lizard extends Actor {@Override public String toString() {return "I'm a lizard";}} 

     private static Actor[] actors;   

     public static Actor[] getActors(Class<?> cls) { 
      //Count actors corresponding to class cls 
      int cnt = 0;  
      for (int i = 0; i<actors.length; i++) 
       if (cls.isInstance(actors[i])) cnt++; 

      //Build a new array; 
      Actor[] clsActors = new Actor[cnt]; 

      //Fill it 
      for (int j = 0, k=0; j<cnt; k++) 
        if (cls.isInstance(actors[k])) 
        clsActors[j++] = actors[k]; 

      return clsActors; 
     } 

    public static void main(String[] args) 
    { 
      actors = new Actor[] {new Frog(), new Lizard()}; 
      System.out.println(Arrays.toString(getActors(Frog.class))); 
    } 
} 

輸出:

[I'm a frog] 

編輯:更優雅版採用列表getActors()的:

public static Actor[] getActors(Class<?> cls) { 
     LinkedList<Actor> chosenActors = new LinkedList<Actor>();   
     for(Actor actor: actors) if(cls.isInstance(actor)) chosenActors.add(actor);       
     return chosenActors.toArray(new Actor[0]); 
    } 
+1

非常感謝您抽出時間寫出一個例子。 –

+0

不客氣!如果您在生產代碼中使用此示例,我會考慮將列表用作返回類型或臨時變量,因爲循環索引容易出錯。 –

+0

如你所說,它確實看起來更加優雅,實際上整個場景機制在之前使用集合。 *我做了醜陋*,因爲集合分配東西(迭代器),我需要這個演員陣列的渲染循環。我現在完成了實施,並且我擺脫了大量的GC_FOR_MALLOC事件。這太遺憾了,因爲使用ArrayLists的代碼看起來很棒......(我之前沒有提到它,但是這是一款Android應用程序,因此適用於低規格設備) –

6

試試這個:

cls.isInstance(yourObject) 

而是採用了instanceof運營商,如果你知道在編譯時類只能使用。

+0

非常感謝您! ,關於使用isInstance方法的性能影響的任何想法? –

+0

它最可能不會比'instanceof'慢。 –

3

instanceof只能與類文字一起使用。您需要使用Class.isInstance(),即

if (cls.isInstance(actors[k])) 
相關問題