从超类或接口列表中获取子类实例
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"”,而不是子组件的实例,这意味着我仍然必须转换它到适当的类型。基本上我希望有一种方法可以:
- 遍历集合。
- 找到一个特定的子class。
- 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
,这也找到给定参数的任何进一步子类。
(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"”,而不是子组件的实例,这意味着我仍然必须转换它到适当的类型。基本上我希望有一种方法可以:
- 遍历集合。
- 找到一个特定的子class。
- 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
,这也找到给定参数的任何进一步子类。