从地图中调用对象并直接投射
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 是否是相同的类来转换它并返回或否则为 null?
回答
您可以使用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);