パラメータとして取得するクラスに一致するすべてのオブジェクトを返すメソッドを作成しようとしています。
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?extendsシナリオ>"
「アクター」は、私のスプライト、たとえば鳥、ヒーローなどによって拡張されます。たとえば、いくつかの計算のために、特定の時間にシナリオ上のすべての鳥のリストを取得するというアイデアです。
ここで何が起こっているのか分かりますか?特定のオブジェクトが特定のクラスのインスタンスであるかどうかをテストするにはどうすればよいですか?
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]);
}
これを試して:
cls.isInstance(yourObject)
instanceof
演算子を使用する代わりに、コンパイル時にクラスを知っている場合にのみ使用できます。
instanceof
は、クラスリテラルでのみ使用できます。 Class.isInstance()
を使用する必要があります。
if (cls.isInstance(actors[k]))