24

パラメータとして取得するクラスに一致するすべてのオブジェクトを返すメソッドを作成しようとしています。

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

ただし、エラーが発生します:「-互換性のないオペランドタイプbooleanおよびClass <capture#1-of?extendsScenario>」

「アクター」は、私のスプライト、たとえばBird、Heroなどによって拡張されます。たとえば、計算のために、特定の時間にシナリオ上のすべてのBirdのリストを取得するというアイデアです。

ここで何が起こっているのか分かりますか?特定のオブジェクトが特定のクラスのインスタンスであるかどうかをテストするにはどうすればよいですか?

4

3 に答える 3

37
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]);
    }
于 2012-11-09T12:46:46.163 に答える
14

これを試して:

cls.isInstance(yourObject)

演算子を使用する代わりに、instanceofコンパイル時にクラスを知っている場合にのみ使用できます。

于 2012-11-09T12:32:26.657 に答える
5

instanceofクラスリテラルでのみ使用できます。Class.isInstance()あなたは、すなわちを使用する必要があります

if (cls.isInstance(actors[k]))
于 2012-11-09T12:33:27.390 に答える