2016-03-07 139 views
1

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. 返回该子类的实例。

我觉得我在这里的正确轨道,但我无法得到它的工作。感谢您的回应和反馈。

回答

4

你需要像

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

方法声明告诉它将返回相同类型的参数传递的一个组成部分。

这样称呼它:

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

工程很棒。但是Eclipse给了我一个警告,说这是一个未经检查的转换 - 这是什么意思,这是我应该处理的事情(如果是这样,怎么办?取消警告?)? – Charanor

+0

警告是由于不安全的类型转换造成的。请参阅我的答案以获得更好的解决方案 - 方法标头相同,但使用“cast”方法完成演员。 – Marwin

+0

@Charanor未检查转换警告显示,因为编译器不知道你执行==检查。但既然你这样做,铸造是绝对安全的,你可以忽略它@SupressWarning(“未选中”)方法注释 – AdamSkywalker

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,这也发现给定参数的任何进一步的子类。