首页 > 解决方案 > 如何在类映射中获取子类

问题描述

我在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);

this 内部调用了这个方法, 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(...));

提前致谢

标签: java

解决方案


向 addComponent 添加参数以传递类:

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

   if (containsComponent(clazz)) return null;

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

推荐阅读