2013-05-18 4 views
8

私はまだJavaにはかなり新しいので、ここではっきりと分からないことがあります。クラスの型をメソッドに渡し、その型にキャストしますか?

I私はすべての私のエンティティのリストからクラス型を選択するために使用し、次のコードを持っている:正常に動作しますが、それは、このメソッドを呼び出すときに、私はまだそれをキャストする必要があることを意味

public Array<?> PickEntities(Class<?> cls) { 
    Array<? super SpriteEntity> allEntities = new Array<Object>(); 
    for (SpriteEntity entity : MyGame.AllEntities) { 
     if (entity.getClass() == cls) { 
       allEntities.add(entity); 
     } 
    } 
    return allEntities; 
} 

反対側のクラス。たとえば:

asteroid = (Asteroid)PickEntities(Asteroid.class); 

は、私は何をしたいのは、私は私のPickEntitiesクラス(CLSパラメータ)に渡すと、その後その型に戻る配列(allEntities)をキャストしていたクラスを使用しています。

これを行う方法はありますか?私が試してみると、「cls」はタイプではなく、キャストに使うことができないと私に伝えます。

+0

クラスの配列はどこに定義されていますか? – Antimony

答えて

14

はあなたの方法は、一般的な次のようになります。私は、標準的なコレクションクラスを使用

public <T extends SpriteEntity> List<T> pickEntities(Class<T> clazz) { 
    List<T> result = new ArrayList<T>(); 
    for (SpriteEntity entity : MyGame.allEntities) { 
     if (entity.getClass() == clazz) { 
      result.add((T) entity); 
     } 
    } 
    return result; 
} 

注意、および標準のJava命名規則。

+0

うわー、それは素晴らしいコードです!完全に動作し、Javaをより使いやすくするための教訓を得ました:D Thanks mate! – boolean

+1

上記のコードは、OPのコードのように、クラスが 'clazz'とまったく同じであるインスタンスのみを含むことに注意してください。サブクラスは含まれません。また、 'clazz.cast(entity)'を呼び出すことでキャストを避けることができます。 – NamshubWriter

関連する問題