首页 > 解决方案 > 从地图中调用对象并直接投射

问题描述

private static final Map<Integer, GameObject> OBJECT = new ConcurrentHashMap<>();

我有一个存储GameObjects 的地图,它由 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 是否是相同的类来强制转换并返回或者为空?

标签: java

解决方案


您可以使用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);

推荐阅读