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

Java 从超类或接口列表中获取子类实例,java,inheritance,methods,subclass,Java,Inheritance,Methods,Subclass,(这个问题和我的问题很相似,但我觉得它们差异很大,我可以创建一个新的问题) 基本上,在我的小3D游戏中,我的所有实体都由许多不同的组件组成,一个用于纹理,一个用于运动等。所有这些子组件都继承自接口“组件”。到目前为止,我一直使用这样的方法 public MovementComponent getMovementComponent() { for (Component c : components) { if (c instanceof MovementComponent)

(这个问题和我的问题很相似,但我觉得它们差异很大,我可以创建一个新的问题)

基本上,在我的小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;
}
获取某个组件的实例。但是现在我想把它改成一个更通用的方法,可以从我的组件列表中获得任何类型的组件。我试着做这样的事情

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;
}
但即使我强制转换结果,它始终返回接口的“实例”,而不是子组件的实例,这意味着我仍然必须将其强制转换为适当的类型。基本上,我希望有一种方法可以:

  • 遍历集合
  • 查找特定的子类
  • 返回该子类的实例

  • 我觉得我在这条路上走对了,但我无法让它工作。感谢您的回复和反馈。

    您需要类似

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

    你需要像这样的东西

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

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

    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;
    }
    
    public getComponentType(类子类){
    用于(组件c:组件){
    if(子类isInstance(c))
    返回子类cast(c);
    }
    返回null;
    }
    

    感谢
    isInstance
    ,它还可以找到给定参数的任何其他子类。

    您需要使用一个通用参数,类似于以下内容:

    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;
    }
    
    public getComponentType(类子类){
    用于(组件c:组件){
    if(子类isInstance(c))
    返回子类cast(c);
    }
    返回null;
    }
    

    感谢
    isInstance
    ,它还可以找到给定参数的任何其他子类。

    非常有效。但是Eclipse给了我一个警告,这是一个未经检查的强制转换-这意味着什么?这是我应该处理的事情吗(如果是,如何处理?抑制警告?)?这个警告是由于不安全的类型转换造成的。有关更好的解决方案,请参见我的答案-方法标题相同,但强制转换是使用
    cast
    方法完成的。@Charanor unchecked cast警告将显示,因为编译器不知道您执行了==检查。但既然你这么做了,施放是绝对安全的,你可以用@superswarning(“unchecked”)方法忽略它annotation@Charanor你也可以使用cast方法,就像你在例子中所做的那样。谢谢大家的快速回答。尽管事实证明,除非我像@Marwin在回答(.cast(c))中所做的那样,否则演员阵容是无效的。我希望我能接受你的两个答案!效果很好。但是Eclipse给了我一个警告,这是一个未经检查的强制转换-这意味着什么?这是我应该处理的事情吗(如果是,如何处理?抑制警告?)?这个警告是由于不安全的类型转换造成的。有关更好的解决方案,请参见我的答案-方法标题相同,但强制转换是使用
    cast
    方法完成的。@Charanor unchecked cast警告将显示,因为编译器不知道您执行了==检查。但既然你这么做了,施放是绝对安全的,你可以用@superswarning(“unchecked”)方法忽略它annotation@Charanor你也可以使用cast方法,就像你在例子中所做的那样。谢谢大家的快速回答。尽管事实证明,除非我像@Marwin在回答(.cast(c))中所做的那样,否则演员阵容是无效的。我希望我能接受你的两个答案!