我在java中的类上遇到了麻烦,我正在制作一个像这样使用HashMap的组件系统

private final Map<Class<? extends Component>, Component> components = new HashMap<>();


Component是所有组件的基本类型,我创建了一个名为Material的抽象类,它是Component的扩展。

public abstract class Material extends Component


这迫使我将其扩展到其他地方以使用它,例如,我制作了TerrainMaterial

public class TerrainMaterial extends Material


我使用以下方法添加组件

public <T extends Component> T addComponent(T component) {

    if (containsComponent(component.getClass())) return null;

    components.put(component.getClass(), component);
    return component;

}


在我的渲染类中,它返回此HashMap尝试获取材质类型。

entity.getComponent(Material.class);


这在内部调用此方法,containsComponent方法是一个完成containsKey检查

public <T extends Component> T getComponent(Class<T> component) {

    if (!containsComponent(component)) return null;

    return component.cast(components.get(component));

}


尝试返回该值时会出现问题,因为TerrainMaterial具有TerrainMaterial的类类型,而不是Material未能找到它的类型,我该如何使用Terrain.class使其返回TerrainMaterial。

请注意,我已经尝试添加像这样的组件,并且进行了铸造,没有任何变化。

terrainEntity.<Material>addComponent(new TerrainMaterial(...));


提前致谢

最佳答案

向addComponent添加参数以传递类:

public <T extends Component> T addComponent(Class<T> clazz, T component) {

   if (containsComponent(clazz)) return null;

   components.put(clazz, component);
   return component;
}

关于java - 如何在类映射中获取子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54916611/

10-10 17:58