java - 如何在类映射中获取子类
问题描述
我在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(...));
提前致谢
解决方案
向 addComponent 添加参数以传递类:
public <T extends Component> T addComponent(Class<T> clazz, T component) {
if (containsComponent(clazz)) return null;
components.put(clazz, component);
return component;
}
推荐阅读
- c - exploit.c -- 缓冲区溢出
- javascript - 如何用数字链接替换数字
- sql - 查询具有一对多关系的 XML 数据
- android - 不允许启动服务 Intent(act=com.google.android.c2dm.intent.RECEIVE..) 应用在后台 uid UidRecord
- java - MappedSuperclass 扩展另一个 MappedSuperclass
- php - 如何适应 dompdf laravel
- java - 当页面没有响应或查找元素超时时,Selenium 如何提示消息框?
- excel - 根据当前日期计算下一个到期日 - Excel
- corda - Corda shell“未找到匹配的构造函数:”但未指定流构造函数参数
- apache-kafka - Kafka:消息偏移量