EntitySpriteMonster instanceof Entity ... это так просто, и это не работает? - PullRequest
1 голос
/ 11 июля 2011

У меня есть такой код:

class Entity;

class EntityTool extends Entity;
class EntitySprite extends Entity;

class EntityToolSpoon extends EntityTool;
class EntityToolBow extends EntityTool;
class EntitySpritePlayer extends EntitySprite;
class EntitySpriteMonster extends EntitySprite;

Теперь у меня есть метод с именем move() в Entity, и некоторые другие перезаписывают его.

Теперь, если аргумент EntitySpriteMonster, почему это не работает:

public void foonction(Object wut)
{
    if (wut instanceof Entity) ((Entity)wut).move(x,y);
}

Функция перемещения (хотя это избыточно и не нужно. Сбой при if rawpeek instanceof...):

@Override
public void move(double x, double y) {
    super.move(x, y);
    for (int i=0; i<8; i++) {
        Object rawpeek = palette.get(i);
        System.out.println(rawpeek);
        if (rawpeek == null) continue;
        if (rawpeek instanceof Entity)
            ((Entity) rawpeek).move(x, y);
    }
}

РЕДАКТИРОВАТЬ: он просто прерывается. (оператор instanceof возвращает false)

Затмение показывает мне в отладке, что wut определенно является EntitySpriteMonster.

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Единственная причина, по которой я знаю, что такой код не работает (когда проверено, что wut имеет правильный тип), заключается в том, что класс wut был загружен загрузчиком классов, отличным от Entity, как вваш класс.

Класс в Java идентифицируется по имени пакета, по простому имени и загрузчику классов, который его загрузил.Так что mypackage.Entity может отличаться от mypackage.Entity , если они были загружены отдельными загрузчиками классов.

Обычно это происходит только при использовании какого-либо плагинав механизме (OSGi, ...).Вы используете что-то подобное?

0 голосов
/ 15 июля 2011

Проблема решена!

Вышеуказанное использование instanceof было правильным. Вместо этого проблема была:

((Inventory)palette).get(index) вернул InventorySlot, а не Entity. InventorySlot содержит Entites, поэтому мне не хватало, чтобы посмотреть первый элемент из контейнера.

Мой правильный код должен быть Object rawpeek = paltte.get(i).peek();

Спасибо всем за попытку. И извините за эту очевидную проблему.

...