1

我确实有一个抽象类,我们称之为“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 是典型的 Object。什么工作是这样的:

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

但我确实需要类似的东西

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

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

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

编辑:也许我想在这里复杂。但基本上我的想法是。要拥有一个带有 GameObjects 的地图,我可以迭代。因此,例如,我可以像迭代思想 currentGameObjects 一样思考,如果它是 Stone(Stone 的实例)做某事。与抽象类 GameObject 相比,A Stone 还可以有额外的字段 Methods 吗?

4

1 回答 1

0

您可以使用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);
于 2013-10-23T16:28:27.507 回答