Java 如何在类映射中获取子类

Java 如何在类映射中获取子类,java,Java,我在java中的类方面遇到了一些问题,我正在制作一个组件系统,它使用了如下的HashMap private final Map<Class<? extends Component>, Component> components = new HashMap<>(); 这迫使我将其扩展到其他地方使用,例如我制作了一个TerrainMaterial public class TerrainMaterial extends Material 我使用以下方法添加一个

我在java中的类方面遇到了一些问题,我正在制作一个组件系统,它使用了如下的HashMap

private final Map<Class<? extends Component>, Component> components = new HashMap<>();
这迫使我将其扩展到其他地方使用,例如我制作了一个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;

}
这在内部调用此方法,containsComponent方法是complecontainsKey检查

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

    if (!containsComponent(component)) return null;

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

}
public T getComponent(类组件){
如果(!containsComponent(component))返回null;
返回component.cast(components.get(component));
}
在尝试返回此值时会出现问题,因为TerrainMaterial的类类型为TerrainMaterial,而不是Material。如果找不到它,我如何在使用Terrain.class时返回此TerrainMaterial

请注意,我已经尝试过像这样添加组件,并且使用了casting,没有任何更改

terrainEntity.<Material>addComponent(new TerrainMaterial(...));
terrainEntity.addComponent(新的TerrainMaterial(…));

提前感谢

向addComponent添加一个参数以通过该类:

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

   if (containsComponent(clazz)) return null;

   components.put(clazz, component);
   return component;
}
public T addComponent(类clazz,T component){
if(containsComponent(clazz))返回null;
组件。放置(clazz,组件);
返回组件;
}

提示:
Class
类有一个
getSuperclass
方法,您可以使用它来迭代继承链。
terrainEntity.<Material>addComponent(new TerrainMaterial(...));
public <T extends Component> T addComponent(Class<T> clazz, T component) {

   if (containsComponent(clazz)) return null;

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