在列表中查找扩展某个类的对象

时间:2012-03-11 23:07:45

标签: java

在我的游戏中,所有游戏对象都扩展了一个实体类。所有敌人的物体都有自己的类,可以扩展敌人。敌人扩展了实体。 换一种说法, 实体 - >敌人 - > SharkEnemy。

现在,我希望有一个函数让我测试与特定类的碰撞。 也就是说,如果我有一个子弹类,我希望它只测试与扩展Enemy的实体的碰撞。

我已经用Google搜索了,这就是我所拥有的:

public <T> Entity collide(Entity a, Class<T> desiredClass)
{

    for (Entity b : entities)
        if (b.getClass() == desiredClass && collide(a, b))
            return b;
    return null;
}

这就是我想要的东西,但我需要知道它是否扩展了desiredClass,而不是如果类等于desiredClass。

4 个答案:

答案 0 :(得分:2)

使用Class.isAssignableFrom()

,而不是检查类的相等性
 public <T> Entity collide(Entity a, Class<T> desiredClass)
 {

     for (Entity b : entities)
         if (desiredClass.isAssignableFrom( b.getClass() ) && collide(a, b))
             return b;
     return null;
 }

答案 1 :(得分:1)

因为你传递了类对象,

for (Entity b: entities)
{
  if (SharkEnemy.class.isInstance(b)...)

答案 2 :(得分:0)

传入(T desiredType)而不是类并使用:

if (b instanceof desiredType)

答案 3 :(得分:0)

也许我没有得到你的确切问题,但你不能只使用接口和多态?如果不使用RTTI,我会看起来更好的设计选择

例如:

abstract class Entity
{
  abstract boolean isCollidingWithBullet(Bullet bullet);
  .. concrete methods ..
}

class Enemy extends Entity
{
  boolean isCollidingWithBullet(Bullet bullet)
  {
    .. specific implementation
  }
}

class NotEnemy extends Entity
{
  boolean isCollidingWithBullet(Bullet bullet)
  {
    return false;
  }
}