java - 从地图中调用对象并直接投射
问题描述
private static final Map<Integer, GameObject> OBJECT = new ConcurrentHashMap<>();
我有一个存储GameObject
s 的地图,它由 PlayerObject、NpcObject、ItemObject 扩展。
我正在尝试创建一种方法,在该方法上我通过 ID 和类类型调用对象并直接对其进行转换,如果它不存在或对象 ID 的类与给定的类不匹配则返回 null。所以例如
final PlayerObject object = getObject(<id>, PlayerObject);
有什么办法吗?
编辑:
我设法做到了:
public <T extends EventObject> T getObject(final int objectId)
{
final EventObject object = OBJECT.get(objectId);
return Objects.nonNull(object) && object.getClass() == ? T (object) : null;
}
但我不想使用 Class<? 在此方法的参数中扩展 EventObject>。我不能以某种方式检查使用泛型 T 是否是相同的类来强制转换并返回或者为空?
解决方案
您可以使用Class#isInstance
来检查对象的类型是否正确并将Class#cast
对象转换为正确的类型。
public static <T extends GameObject> T getObject(Integer id, Class<T> clazz) {
GameObject obj = OBJECT.get(id);
if(!clazz.isInstance(obj)) return null;
return clazz.cast(obj);
}
// ...
final PlayerObject object = getObject(<id>, PlayerObject.class);
推荐阅读
- prometheus - 从节点到 daemonset/kube-prometheus-exporter-node 的标签
- google-api - Youtube API 更高的配额(表格):响应时间和价格
- reactjs - 如何处理双 forEach 中的异步函数?
- ios - Swift iOS - 无法从 cocoapod 的文件中访问我的课程或通知
- algorithm - 如何最大化嵌套容器?
- node.js - Node 和 NPM 运行脚本和 Ctrl-C 触发 SIGINT 两次
- javascript - React Pinpad 与输入按钮
- blockchain - Corda 如何替代金融行业当前使用的数据一致性
- python - Django 'SessionStore' 对象没有属性 '_session_cache'
- apache-spark - 如何加快一个复杂数据集的处理/写入