2010-11-13 27 views
1

我想存儲不同類型在這樣的地圖:從虛空鑄造,存儲在地圖任何類型的

public Map< String, Void > common; 
MyClass object = new MyClass(); 
common.put("Object1", object); 

,然後用它是這樣的:

Void object = common.get("Object1"); 
((MyClass)object).runAnyFunction(); 

這隻能如果我創建了一個名爲Void的自己的空類,並擴展了我將放在Map with Void中的所有類。所以問題解決了,除非...

Java中沒有Void嗎?如果我不創建我自己的Void類仍然有效。直到我到達演員的地方,我嘗試.runAnyFunction()。也許如果我試圖用Void擴展我的類 - 但只適用於我創建的Void,而不是Java的Void。

這真的歸結爲如果我真的需要創建我自己的空虛空類。或者,如果我可以使用Java自己的Void?

+1

'在Java中Void'類是泛型返回類型標記,不能被實例化,實際上它的只有一部分,你可以真正使用的是'Void.TYPE',它只返回'Class '。 – Esko 2010-11-13 22:38:39

回答

6

爲什麼你不使用Object?所有Java類都是從Object直接或間接派生的子類。

public Map< String, Object > common; 
+1

初始化地圖也很重要:) – 2010-11-13 20:37:15

+0

是的,這是真的! – 2010-11-13 20:39:27

+0

這是一個很好的問題!爲什麼我不使用Object?嗯... Thanx! – Espen 2010-11-13 20:49:55

1

我很抱歉問這個問題,但您爲什麼使用這個解決方案?我認爲每次你想把一種類型轉換成另一種類型時,你應該停下來再考慮一下你的設計。

真的,你想要執行方法「runAnyFunction()」。怎麼樣創建界面

public interface Runner {public void runAnyFunction();

}

現在定義您的地圖爲地圖。

然後你可以說沒有任何鑄造的map.get(「foo」)。runAnyFunction()。

你可以創建儘可能多的你需要的Runner實現。這被稱爲多態性和一般面向對象的設計。

下一步可能是重用一個現有的接口,例如,可運行或可調用。

我甚至寫了現有的接口的這種用法很短的文章:http://java.dzone.com/articles/useful-abuse

+0

因爲我有不同界面的對象。如果它們都具有函數runAnyFunction(),那麼可以這樣做。但是,它們具有不同的功能和公共變量。但他們確實有獨特的ID。這就是爲什麼我將所有對象存儲在一個Map上並通過它們的ID來調用它們的原因...... – Espen 2010-11-13 23:20:10