从超类或接口列表中获取子类实例

Get subclass instance from list of superclasses or interfaces

(This 问题和我的很相似,但我觉得它们有很大的不同,我可以创建一个新的问题)。

基本上,在我的小型 3D 游戏中,我的所有实体都由许多不同的组件组成,一个用于纹理,一个用于运动等。所有这些子组件都继承自界面 "Component"。到目前为止,我一直使用这样的方法;

public MovementComponent getMovementComponent() {
    for (Component c : components) {
        if (c instanceof MovementComponent)
            return (MovementComponent) c;
    }

    return null;
}

获取某个组件的实例。但现在我希望将其更改为更通用的方法,可以从我的组件列表中获取任何类型的组件。我测试过这样做;

public Component getComponentType(Class component) {
    for (Component c : components) {
        if (c.getClass() == component)
            return c.getClass().cast(c);
    }

    return null;
}

但是即使我总是将结果转换为 returns 接口的“"instance"”,而不是子组件的实例,这意味着我仍然必须转换它到适当的类型。基本上我希望有一种方法可以:

  1. 遍历集合。
  2. 找到一个特定的子class。
  3. Return那个子实例class.

我觉得我在正确的轨道上,但我无法让它工作。感谢您的回复和反馈。

你需要这样的东西

public <T extends Component> T getComponentType(Class<T> component) {
    ...
    return (T) c;
}

方法声明表明它将return一个相同类型的组件传入参数。

这样称呼它:

MovingComponent mc = smth.getComponentType(MovingComponent.class);

您需要使用通用参数,如下所示:

public <C extends Component> C getComponentType(Class<C> subclass) {
    for (Component c : components) {
        if (subclass.isInstance(c))
            return subclass.cast(c);
    }
    return null;
}

感谢 isInstance,这也找到给定参数的任何进一步子类。