2013-04-09 70 views
0

我有一個方法是這樣的: -如何將HashMap轉換爲WeakHashMap?

public Map<String,String> loadProperties() Exception{ 
    Map <String,String> params = new HashMap<String,String>(); 
. 
. 
. 
    return params; 
} 

上述方法返回我從DB一個地圖(鍵,值)。

我需要TypeCast loadProperties()到WeakHashMap。下面我有另一個叫做Service的類。我在構造函數中嘗試了類型轉換,但它給了我ClassCastException。

"java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.WeakHashMap" 

下面是服務類: -

private Service() throws Exception { 
    configPropertiesCache = dao.loadProperties(); 
configPropertiesCache = (WeakHashMap<String, String>) dao.loadProperties(); 

我很好奇,想知道爲什麼它不工作?

+0

類型強制轉換!=對象轉換。 – EJP 2013-04-11 01:05:08

回答

6

它不起作用,因爲HashMap根本不是WeakHashMap。類型轉換不會進行任何形式的從一種類型到另一種類型的魔法轉換。

類型轉換的唯一含義就是告訴編譯器,您希望它將一種類型的對象當作另一種類型的對象處理 - 但在運行時仍會執行檢查以檢查您正在投射的對象實際上就是您投射的對象,如果檢查失敗,您將獲得ClassCastException

無論是在你的loadProperties()方法創建地圖作爲WeakHashMap,或者如果您不能修改該法,將其複製到WeakHashMap

configPropertiesCache = new WeakHashMap<>(dao.loadProperties()); 
0

HashMap不是WeakHashMap所以你不能投一個。但是,您可以通過loadProperties方法返回WeakHashMap,或手動將HashMap轉換爲WeakHashMap

0

HashMap和WeakHashMap的是不同的Map實現,正因爲如此,你可以互不相讓。通常,如果ClassA具有ClassB和ClassC的子類,那麼可以將ClassB或ClassC強制轉換爲ClassA,但不能將ClassB轉換爲ClassC,反之亦然。

如果你想把HashMap變成WeakHashMap,那麼你需要創建一個新的WeakHashMap,然後遍歷你的HashMap並將它的所有鍵值對添加到WeakHashMap。

2

做這樣的:

public WeakHashMap<String, String> getWeakHashMap(Map<String, String> map) { 
    if (map instanceof WeakHashMap) { 
     return (WeakHashMap<String,String>) map; 
    } 
    return new WeakHashMap<String,String>(map); 
} 
0

類型轉換將無法正常工作,但你可以創建一個asWeakHashMap方法,需要一個地圖,將所有條目進入一個新的WeakHashMap並返回該地圖。

0

您不能將Map轉換爲WeakHashMap,但您可以創建一個新的WeakWashMap,其中包含所有值。您可以使用該代碼:

Map<String, String> otherMap = new HashMap()<String, String>; 
map.put("Hello", "World"); 
WeakHashMap<String, String> weakMap = new WeakHashMap(otherMap); 
System.out.println(weakMap.get("Hello")); 
相關問題