【问题标题】:Get subclass instance from list of superclasses or interfaces从超类或接口列表中获取子类实例
【发布时间】:2016-03-07 22:37:19
【问题描述】:

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

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

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;
}

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

  1. 遍历集合。
  2. 查找特定的子类。
  3. 返回该子类的实例。

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

【问题讨论】:

    标签: java inheritance methods subclass


    【解决方案1】:

    你需要类似的东西

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

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

    这样称呼它:

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

    【讨论】:

    • 效果很好。但是 Eclipse 给了我一个警告,它是一个未经检查的演员 - 这是什么意思,这是我应该处理的事情(如果是,如何?抑制警告?)?
    • 警告是由于不安全的类型转换。请参阅我的答案以获得更好的解决方案 - 方法标题是相同的,但演员是使用 cast 方法完成的。
    • @Charanor unchecked cast 警告显示,因为编译器不知道您执行了 == 检查。但是既然你这样做了,强制转换是绝对安全的,你可以用 @SupressWarning("unchecked") 方法注释忽略它
    • @Charanor 您也可以像在示例中那样使用 cast 方法
    • 感谢大家的快速解答。尽管事实证明,除非我按照@Marwin 在他的回答(.cast(c))中所做的那样做,否则铸造不起作用。我希望我能接受你的两个答案!
    【解决方案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,这还可以找到给定参数的任何其他子类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多