【问题标题】:Returning a child class返回一个子类
【发布时间】:2014-02-03 15:01:24
【问题描述】:

抱歉标题含糊,我不太清楚如何解释我的问题。

我正在创建一个实体组件系统 (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;
}

我的问题在于返回组件的类型转换。我将举一个简单的例子。在管理所有Name 组件的Namer 类中,我想循环遍历实体数据库,获取实体的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's,我宁愿不必担心每次我想使用它时都会转换组件类型。

谢谢。

【问题讨论】:

    标签: java entity


    【解决方案1】:

    您可以这样做,您只需稍微更改方法签名中的泛型即可:

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

    现在,Generics 知道您的 getComponent 方法返回一个 T 类型的对象,并且在调用 getComponent 时无需进行强制转换 - 尽管您的 getComponent 实现可能仍需要在内部进行强制转换。

    【讨论】:

      【解决方案2】:

      我希望能够做到这一点:

      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

      【讨论】:

      • 第二个参数应该是 Class 类型,这将允许编译器推断泛型类型而不是类型 .&lt;Name&gt;... 就像在 Tim B. 的回答中一样。
      • 非常感谢,这就是我想要的。澄清一下,我已经尝试将返回值更改为&lt;? extends Component&gt;,但我想这是不可能的。感谢您的回答。
      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2014-12-16
      • 1970-01-01
      • 2015-03-09
      • 2019-04-25
      • 1970-01-01
      相关资源
      最近更新 更多