我确实有一个abstact类,可以将其称为“ GameObjects”,以及许多类似于“ Stone”的子类。
在运行时,我解析了一个Xml文件,其中我读到了需要创建的GameObject(例如“ Stone”)以及有关它们的一些其他信息。为了创建特定的GameObject,我使用如下反射:
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 中。但这不起作用:
currentGameObjects.put(name, gameObj);
显然是因为gameObj是典型的Object。工作原理如下:
currentGameObjects.put(name, (GameObject)gameObj);
但是我非常需要这样的东西
currentGameObjects.put(name, (Stone)gameObj);
问题就像我说的那样,我在运行时不知道它是石头还是花朵还是彩虹等等。
任何想法,我怎么能做到这一点,或一个好的解决方法?
编辑:
也许我想在这里变得复杂。
但基本上我的想法是。要拥有带有GameObjects的地图,我可以进行迭代。
因此,例如,我可以像反复考虑currentGameObjects一样思考,如果它是Stone(Stone实例)可以做某事。
与抽象类GameObject相比,Stone还可以具有其他字段方法。
最佳答案
您可以使用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);