2013-05-18 8 views
8

Wciąż jestem całkiem nowy w Javie, więc być może brakuje tu czegoś oczywistego.Przekazywanie typu klasy do metody, a następnie rzutowanie na ten typ?

Mam następujący kod, który używam do piłki typy klas z listą wszystkich moich podmiotów:

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

To działa dobrze, ale to oznacza, że ​​gdy wywołanie tej metody nadal muszę oddać go do klasa po drugiej stronie. Na przykład:

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

Co chciałbym zrobić, to użyć klasy ja przechodząc do mojej klasy PickEntities (parametr CLS), a następnie rzucić powracających array (allEntities) do że typu.

Czy istnieje sposób, aby to zrobić? Ilekroć próbuję, po prostu mówi mi, że "cls" nie jest typem i nie można go używać do rzucania.

+0

Gdzie jest zdefiniowana klasa Array? – Antimony

Odpowiedz

14

Twoja metoda powinna być ogólna:

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

Zauważ, że użyłem standardowych klas kolekcji, a standardowe konwencje nazewnictwa Java.

+0

Wow, to świetny kod! Działa doskonale, a ja mam lekcję, jak lepiej korzystać z Javy: D Dzięki kolego! – boolean

+1

Należy zauważyć, że powyższy kod, podobnie jak kod z OP, będzie zawierał tylko wystąpienia, w których klasa jest dokładnie taka sama jak "clazz"; nie będzie zawierać podklas. Ponadto można uniknąć rzutowania, wywołując 'clazz.cast (entity)' – NamshubWriter

Powiązane problemy