reservada palabra java instanceof

java - palabra reservada instanceof



parámetro instanceof Class<?> (3)

Estoy tratando de escribir un método para devolver todos los objetos que coinciden con la clase que recibe como parámetro:

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

Sin embargo, recibo un error: "- Los tipos de operandos incompatibles booleanos y Clase < captura # 1-de? Extiende el Escenario >"

''Actor'' se extiende por mis sprites, por ejemplo, Bird, Hero, etc. La idea es, por ejemplo, obtener una lista de todas las aves en el escenario en un momento dado para algunos cálculos.

¿Alguna idea de lo que está pasando aquí? ¿Cómo probar si un objeto dado es una instancia de una clase dada?


Prueba esto:

cls.isInstance(yourObject)

en lugar de usar el operador instanceof , que solo puede usarse si conoce la clase en tiempo de compilación.


instanceof solo se puede utilizar con literales de clase. Necesitas usar Class.isInstance() , es decir

if (cls.isInstance(actors[k]))


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

Salida:

[I''m a frog]

Edición: Versión más elegante de getActors () usando una Lista:

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