2013-10-23 36 views
1

我確實有一個抽象類,我們稱之爲「GameObjects」和許多像「Stone」一樣的子類。 在運行時即時解析一個Xml文件,在那裏我閱讀了關於需要被創建的GameObjects(比如「Stone」)和一些關於它們的附加信息。要創建特定的遊戲對象我使用反射像這樣:用HashMap反射

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); 

現在我想把遊戲物體進入一個HashMap <字符串,遊戲對象>。但是這不起作用:

currentGameObjects.put(name, gameObj); 

明顯地導致gameObj是typ對象。什麼工作是一樣的東西:

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

但我實際上可以需要像

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

問題是像我說,我不知道在運行時,如果它是一個石或花或彩虹或任何.. ..

任何想法如何我可以實現,或一個很好的解決方法?

編輯: 也許我想在這裏變得複雜。 但基本上我的想法是。爲了讓我可以遍歷GameObjects的Map。 因此,舉例來說,我可以這樣認爲,就像iterate思考currentGameObjects和它的石頭(Stone的實例)一樣。 另外一塊石頭可以有更多的字段與抽象類GameObject相比較的方法嗎?

+3

只是好奇,爲什麼你需要轉換爲'Stone' /'Flower' /等?如果你的'HashMap'是'HashMap '',那麼投射到'GameObject'就足夠了...... –

+1

你期待'currentGameObjects.put(name,(Stone)gameObj)';'over'currentGameObjects有什麼好處。放(名稱,(GameObject)gameObj);'?地圖的用戶仍然會將寶石視爲「GameObject」實例。 – Thomas

+0

爲什麼你需要反思?爲什麼你不能簡單地解析和使用合適的構造函數? – arynaq

回答

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);