抱歉,标题含糊,我不确定如何解释我的问题。
我正在创建一个实体组件系统(ECS),但遇到了一些麻烦。我有一个名为getComponent()
的函数,其作用是使用给定的组件类(在本例中为Name
组件)从给定的实体中获取特定的组件。到目前为止,我可以匹配component
和componentClass
以返回正确的组件。这是函数:
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