Java 从超类或接口列表中获取子类实例
(这个问题和我的问题很相似,但我觉得它们差异很大,我可以创建一个新的问题) 基本上,在我的小3D游戏中,我的所有实体都由许多不同的组件组成,一个用于纹理,一个用于运动等。所有这些子组件都继承自接口“组件”。到目前为止,我一直使用这样的方法Java 从超类或接口列表中获取子类实例,java,inheritance,methods,subclass,Java,Inheritance,Methods,Subclass,(这个问题和我的问题很相似,但我觉得它们差异很大,我可以创建一个新的问题) 基本上,在我的小3D游戏中,我的所有实体都由许多不同的组件组成,一个用于纹理,一个用于运动等。所有这些子组件都继承自接口“组件”。到目前为止,我一直使用这样的方法 public MovementComponent getMovementComponent() { for (Component c : components) { if (c instanceof MovementComponent)
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))中所做的那样,否则演员阵容是无效的。我希望我能接受你的两个答案!