Сравнение разных классов с использованием instanceof - PullRequest
2 голосов
/ 06 апреля 2020
  • абстрактный объектный класс Entity.class
  • Player.class расширяет Entity
  • Wall.class расширяет Entity
                 public class slkjflksdjf
                 {
                     ArrayList entities = new ArrayList();
                     Player player = new Player();
                     Wall wall = new Wall();

                     public slkjflksdjf()
                     {

                         entities.add(player);
                         entities.add(wall);

                         for(int i = 0; i < entities.size(); i++)
                         {

                             if(entities.get(i) instanceof Wall)
                             {
                                 //do something
                             }

                         }

                     }
                 }

При проверке instanceof через мой фактический полный список сущностей, он бросает блок «сделать это» снова и снова, иными словами, быстро воспроизводит аудиоклип. Так что, насколько я могу судить, он рассматривает Стену и Плеер как сущность, так что делает InstanceOf просто заставляет его тянуть истину, даже если они все являются расширениями Первоначальной сущности?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Если Player является подклассом Entity, а Wall является подклассом Entity:

player instanceof Entity возвращает true.

Если Wall является подклассом Entity:

wall instanceof Entity возвращает true.

Однако обратное неверно (.ie instanceof of Wall) Почему? Потому что так определяется оператор instanceof.

Более того, если Wall и Player не связаны (имеется в виду, что один не является подклассом другого или не реализуется в случае интерфейсов). Игрок instanceof Wall возвращает false, а wall instanceof Player возвращает false.

0 голосов
/ 06 апреля 2020

Если игрок и стена расширяют интерфейс Entity, вы можете сделать следующее:

ArrayList<Entity> entities = new ArrayList<Entity>();
Player player = new Player();
Wall wall = new Wall();

entities.add(0, player);
entities.add(1, wall);

// entities.get(0) instanceof Player is true
// entities.get(0) instanceof Wall is false
// entities.get(0) instanceof Entity is true

// entities.get(1) instanceof Player is false
// entities.get(1) instanceof Wall is true
// entities.get(1) instanceof Entity is true

for(Entity entity : entities) {

  if(entity instanceof Player) {
    // is player
  } else if(entity instanceof Wall) {
    // is wall
  }

}

надеюсь, это поможет

...