2014-12-27 2 views
0

У меня есть класс GameWorld, где I update и render большая часть моей игры. В этом классе мне нужен метод, который удаляет объекты, выходящие за пределы экрана. Кроме того, поскольку большинство моих игровых объектов хранятся в ArrayLists, мне нужно создать общий метод, который может выполнять это задание для нескольких типов объектов. Это говорит о том, что я знаю, что для того, чтобы это работало с генериками, эти «объекты» должны быть связаны друг с другом: либо путем наследования, либо с помощью интерфейсов. Это говорит о том, что я пробовал:Ограниченный тип Параметр, не разрешающий доступ к методам соответствующих объектов

У меня есть интерфейс под названием WorldEntities, который в целом отражает то, что должно делать каждая сущность в игре. Вот оно:

public interface WorldEntities { 
    void update(float delta, GameWorld game); 
    void render(SpriteBatch batch); 
    Vector2 getPosition(); 
    Rectangle getBounds(); 
} 

Используя этот интерфейс, я пытался создать универсальный метод, который может удалить любой объект, который выходит за пределы экрана границ. Вот моя попытка:

public <T extends WorldEntities> void deleteOffScreenObjects(ArrayList<T> objectList){ 
    Iterator itr = objectList.iterator(); 
    while (itr.hasNext()){ 
     if(itr.next().getPosition().y < -AssetLoader.cloud.getHeight()){ 
      itr.remove(); 
     } 
    } 
} 

Этот метод, однако, имеет проблемы в itr.next().getPosition().y о том, что Cannot resolve method getPosition().

Сначала я думал, что первое, что приходит после extends, должно быть нормальным классом. Из того, что я прочитал, это правда, но только если у вас есть ограниченные параметры с интерфейсами и классами, поэтому это не может быть проблемой. (Из документации: "If one of the bounds is a class, it must be specified first.")

ПРИМЕЧАНИЕ: -AssetLoader.cloud.getHeight() является постоянным. Я изменю его после того, как эта проблема будет решена.

Так что мой вопрос: почему я не могу получить доступ к getPosition(), хотя любой параметр, который передается в deleteOffScreenObjects, реализует интерфейс, который гарантирует, что этот метод доступен и реализован?

ответ

2

Вы используете raw type для декларации итератора, который не имеет никакой информации о типах, хранящихся в List

Iterator<T> iterator = objectList.iterator(); 
+0

Спасибо! Не могу поверить, что я не поймал этого, прочитав так много статей! –

2

Вам необходимо ввести итератор, а также ...

Iterator itr = objectList.iterator(); 

Становится

Iterator<T> itr = objectList.iterator(); 

Таким образом, когда вы звоните .next() на вашем Iterator<T> вы вернете объект типа T, а не только Object (который по умолчанию используется, если вы явно не вводите свой итератор).

+0

Да, и это тоже имеет смысл. –

Смежные вопросы