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

时间:2016-03-07 22:37:20

标签: java inheritance methods subclass

This问题与我的问题类似,但我觉得它们不同,我可以创建一个新的。)

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

e = exp.select { |k, v| v[:cty] == 'man' }.to_h
# => {:spec=>{:cty=>"man", :ins=>2}, :aha=>{:cty=>"man", :ins=>0}}

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

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

    return null;
}

但即使我投出结果,这总是会返回一个""""""""接口,永远不是子组件的实例,这意味着我仍然必须将其转换为适当的类型。基本上我希望有一种方法可以:

  1. 遍历集合。
  2. 查找特定的子类。
  3. 返回该子类的实例。
  4. 我觉得我在这里走在正确的轨道上,但我无法让它发挥作用。感谢您的回复和反馈。

2 个答案:

答案 0 :(得分:4)

你需要像

这样的东西
public <T extends Component> T getComponentType(Class<T> component) {
    ...
    return (T) c;
}

方法声明告诉它将返回在参数中传递的相同类型的组件。

这样称呼:

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

答案 1 :(得分:2)

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

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

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