抱歉,标题含糊,我不确定如何解释我的问题。

我正在创建一个实体组件系统(ECS),但遇到了一些麻烦。我有一个名为getComponent()的函数,其作用是使用给定的组件类(在本例中为Name组件)从给定的实体中获取特定的组件。到目前为止,我可以匹配componentcomponentClass以返回正确的组件。这是函数:

public static Component getComponent(int id, Class<? extends Component> componentClass){
    ArrayList<Component> entity = getEntity(id);
    for(Component component : entity){
        if(component.getClass() == componentClass){
            return component;
        }
    }

    return null;
}


我的问题在于返回组件的类型转换。我举一个简单的例子。在管理所有Namer组件的Name类中,我想遍历实体数据库,获取实体的Name组件,执行逻辑,然后继续。问题是,为了从Name获取数据,我必须像这样强制转换组件:

int entity = i;
Name n = (Name)Game.getComponent(entity, Name.class);


我希望能够做到这一点:

int entity = i;
Name n = Game.getComponent(entity, Name.class);
n.test = "Bob Binley"


我知道这是一个奇怪的“问题”,因为它可以正常工作,但是让这样的代码感到不舒服。考虑到将使用许多不同的getComponent()大量调用Component函数,我宁愿不必每次都希望使用它时就转换组件类型。

谢谢。

最佳答案

我希望能够做到这一点:


Name n = Game.getComponent(entity, Name.class);


getComponent(e,cls)返回Component,而不是Name。您怎么期望不投?但是,您可以定义getComponent以返回C,其中C extends Component

public static <C extends Component> C getComponent(int id, Class<C> componentClass)  {


然后可以不带任何强制转换的方式调用它:

Name n = ClassName.getComponent(entity, Name.class);


正如Tim B在回答中所提到的,在getComponent函数体中可能仍然需要强制转换。

这是一个相关的问题:Calling static generic methods

还有更多信息:https://www.google.com/search?q=calling+static+functions+with+generics

10-07 11:59
查看更多