gpt4 book ai didi

java - 用 HashMap 进行反射

转载 作者:行者123 更新时间:2023-12-01 04:14:43 25 4
gpt4 key购买 nike

我确实有一个抽象类,我们称之为“GameObjects”和很多子类,例如“Stone”。在运行时,我解析一个 Xml 文件,在其中我读到了需要创建的游戏对象(如“石头”)以及有关它们的一些附加信息。为了创建特定的游戏对象,我使用如下反射:

Class<?> cl = Class.forName("classpath."+typ);
Constructor con = cl.getConstructor(float.class, float.class, float.class, float.class);
Object gameObj = con.newInstance(xPos, yPos, widht, height);

现在我想将 GameObject 放入 HashMap< String, GameObject> 中。但这不起作用:

currentGameObjects.put(name, gameObj);

显然,因为 gameObj 是对象类型。有效的方法是这样的:

currentGameObjects.put(name, (GameObject)gameObj);

但我确实需要类似的东西

currentGameObjects.put(name, (Stone)gameObj);

问题就像我说的,我在运行时不知道它是石头、花还是彩虹还是其他什么......

知道如何实现这一目标,或者有一个好的解决方法吗?

编辑:也许我想在这里变得复杂。但基本上我的想法是。为了拥有一个带有游戏对象的 map ,我可以迭代。例如,我可以像迭代思考 currentGameObjects 一样思考,如果它是一个 Stone(Stone 的实例),就做一些事情。与抽象类 GameObject 相比,A Stone 还可以有额外的字段Methods 吗?

最佳答案

您可以使用 Class::asSubclass 投出你的Class<?>到更精确的类型,然后通过构造函数将该类型传播到新实例:

Class<? extends GameObject> cl = Class.forName("classpath." + typ).asSubclass(GameObject.class);
Constructor<? extends GameObject> con = cl.getConstructor(float.class, float.class, float.class, float.class);
GameObject gameObj = con.newInstance(xPos, yPos, widht, height);

关于java - 用 HashMap 进行反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19545535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com