2013-04-09 71 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")); 
相关问题