2013-05-18 14 views
8

Ich bin immer noch ziemlich neu in Java, so dass ich etwas offensichtliches hier vermisse.Übergeben Sie einen Klassentyp an eine Methode und dann an diesen Typ?

Ich habe den folgenden Code, dass ich Klasse verwenden Typen aus einer Liste aller meiner Entitäten zu holen:

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

Das funktioniert gut, aber es bedeutet, dass, wenn Sie diese Methode aufrufen ich werfen müssen, um es noch zu die Klasse auf der anderen Seite. Zum Beispiel:

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

Was würde ich tun möchte, ist die Klasse verwendet ich bin vorbei an meine PickEntities Klasse (die cls-Parameter) und warf dann die zurückkehrenden Array (allEntities) zu dass Typ.

Gibt es eine Möglichkeit, dies zu tun? Wenn ich es versuche, sagt es mir einfach, dass "cls" kein Typ ist und nicht zum Casting verwendet werden kann.

+0

Wo ist die Klasse Array definiert? – Antimony

Antwort

14

Ihre Methode sollte generic:

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

Bitte beachte, dass ich Standard Collection-Klassen verwendet, und Standard-Java-Namenskonventionen.

+0

Wow, das ist ein toller Code! Funktioniert perfekt und ich habe gelernt, Java besser zu nutzen: D Danke, Kumpel! – boolean

+1

Beachten Sie, dass der obige Code, wie der Code aus dem OP, nur Instanzen enthält, in denen die Klasse genau mit 'clazz' übereinstimmt; Es enthält keine Unterklassen. Außerdem können Sie die Besetzung vermeiden, indem Sie 'clazz.cast (entity)' aufrufen – NamshubWriter

Verwandte Themen