This question already has answers here:
Finding the specific type held in an ArrayList<Object> (ie. Object = String, etc.)
                                
                                    (2个答案)
                                
                        
                                4年前关闭。
            
                    
我正在用Java(使用LibGDX)为游戏引擎编写Entity Component System

我有一个带有各种组件的arraylist的实体。每个组件都从基本Component类继承。

我想在我的实体上有一个方法,可以给我引用特定类型的组件(例如,RenderComponent,PhysicsComponent等)。我已经尝试了以下方法,但是它似乎不起作用。

public class Entity
{
   private ArrayList<Component> _components;

   ...

    public void AddComponent(Component c)
    {
            _components.add(c);
            c.Enable();
    }

    public Component GetComponent(String componentType)
    {
        Component s = null;

        for (int i = 0; i < _components.size(); i++)
        {
            if (_components.get(i).getClass().getSimpleName() == componentType)
                    s = _components.get(i);
        }

        return s;
    }
}


返回的对象为null。

我应该怎么做?有没有更聪明的方法可以使参数指定类型(而不是简单的字符串)?

另外,如果我需要特定类型的所有组件怎么办?我该如何处理?

我读了一些有关反射的内容,但是我从未使用过它。我对Java编程还是很陌生。

提前致谢。

最佳答案

尝试这个

public class Entity
{
    private ArrayList<Component> _components;

    ...

    public void addComponent(Component c)
    {
        _components.add(c);
        c.Enable();
    }

    public Component getComponent(Class componentClass)
    {
        for (Component c : _components)
        {
            if (c.getClass() == componentClass)
                return c;
        }

        return null;
    }
}


您可以这样调用方法:

getComponent(PhysicsComponent.class)


并获取列表:

    public List<Component> getAllComponents(Class componentClass)
    {
        List<Component> components = new ArrayList<Component>();
        for (Component c : _components)
        {
            if (c.getClass() == componentClass)
                components.add(c);
        }

        return components;
    }

10-06 04:08