Java: 如何检索数组列表中的特定类型?

Java: how to retrieve a specific type in an arraylist?

我正在 Java 中为游戏引擎编写 Entity Component System(使用 LibGDX)。

我有一个包含各种组件的数组列表的实体。每个组件都继承自一个基础组件 class.

我想在我的实体上有一个方法,可以为我提供对特定类型组件(例如 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;
    }
}

返回的对象为空

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

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

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

提前致谢。

幸运的是,这可以在不诉诸于称为反射的可怕事物的情况下完成。您可以简单地使用 instanceof 运算符。例如:

for (Component c : components)
    if (c instanceof PhysicsComponent)
        return c;

将==替换为.equals

if (_components.get(i).getClass().getSimpleName().equalsIgnoreCase(componentType))

注意:为什么不使用 Map 而不是 List?它会更快。

编辑:很简单。下面是 Map 的实现方式。

private Map<String, Component> _components = new HashMap<String, Component>();

public void addComponent(Component c) {
    _components.put(c.getClass().getSimpleName(), c);
    c.Enable();
}

public Component getComponent(String componentType) {
    return _components.get(componentType);
}

能否在每个组件 class 中添加一个 public 最终静态字符串或枚举字段来指示类型,然后将其用于类型检查而不是反射?然后你可以把所有这些类型放在一个枚举中。反射太慢而且代价高昂。

您可以传入 class 类型。

public Component GetComponent(Class componentType){

    Component s = null;

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

    return s;
}

试试这个

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;
    }