Java 类的实例<&燃气轮机;参数

Java 类的实例<&燃气轮机;参数,java,instanceof,Java,Instanceof,我正在尝试编写一个方法,以返回与它作为参数获取的类匹配的所有对象: public class Scenario extends View { ... private Actor[] actors = new Actor[1024]; ... public Actor[] getActors(Class<?> cls) { //Count actors corresponding to class cls int

我正在尝试编写一个方法,以返回与它作为参数获取的类匹配的所有对象:

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;
    }
}
公共类场景扩展视图{
...
私有参与者[]参与者=新参与者[1024];
...
公共参与者[]获取参与者(类别cls){
//计算与类cls相对应的参与者
int-cnt=0;
对于(int i=0;i请尝试以下方法:

cls.isInstance(yourObject)

而不是使用
instanceof
运算符,该运算符只能在编译时知道类时使用。

instanceof
只能与类文本一起使用。您需要使用

编辑:更优雅的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]);
    }
publicstaticactor[]getActors(类cls){
LinkedList chosenActors=新LinkedList();
for(Actor-Actor:actors)if(cls.isInstance(Actor))chosenActors.add(Actor);
返回chosenActors.toArray(新Actor[0]);
}

非常感谢!您知道使用isInstance方法对性能的影响吗?很可能不会比
instanceof
慢。非常感谢您花时间编写一个示例。不客气!如果您在生产代码中使用此示例,我会考虑使用列表作为返回类型或临时变量,因为它很容易在循环索引中出错。正如您所说,使用集合确实看起来更优雅,实际上整个场景机制以前都使用集合。我把它弄得很难看,因为集合分配东西(迭代器)我需要这个用于渲染循环的actor数组。我现在已经完成了它的实现,并且我摆脱了大量的GC_for_MALLOC事件。这很遗憾,因为使用ArrayLists时代码看起来很棒…(我以前没有提到过,但这是一个android应用程序,所以针对低规格设备)
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]
    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]);
    }