0

我有这样的方法:-

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

上面的方法从数据库中返回一个 (key , value) 的 Map。

我需要将 loadProperties() 类型转换为 WeakHashMap。下面我有另一个类叫做服务。我在其构造函数中尝试了类型转换,但它给了我 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(); 

我很想知道为什么它不起作用?

4

6 回答 6

7

它不起作用,因为 aHashMap根本不是 a WeakHashMap。类型转换不会进行任何从一种类型到另一种类型的神奇转换。

类型转换的唯一含义是您告诉编译器您希望它将一种类型的对象视为另一种类型的对象 - 但仍会在运行时进行检查以检查您的对象是否是铸造真的是你铸造它的东西,如果检查失败,你会得到一个ClassCastException.

WeakHashMap在您的方法中将地图创建为 a loadProperties(),或者如果您无法修改该方法,请将其复制到 a 中WeakHashMap

configPropertiesCache = new WeakHashMap<>(dao.loadProperties());
于 2013-04-09T14:08:08.837 回答
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);
}
于 2013-04-09T14:09:19.003 回答
0

HashMap不是,WeakHashMap所以你不能将一个投射到另一个。但是,您可以WeakHashMap在您的loadProperties方法中返回,或手动将其转换HashMap为。WeakHashMap

于 2013-04-09T14:06:53.273 回答
0

HashMap 和 WeakHashMap 是不同的 Map 实现,因此您不能将一个转换为另一个。通常,如果您的 ClassA 具有子类 ClassB 和 ClassC,则可以将 ClassB 或 ClassC 转换为 ClassA,但不能将 ClassB 转换为 ClassC,反之亦然。

如果要将 HashMap 转换为 WeakHashMap,则需要创建一个新的 WeakHashMap,然后遍历 HashMap 并将其所有键值对添加到 WeakHashMap。

于 2013-04-09T14:08:59.060 回答
0

类型转换不起作用,但您可以创建一个asWeakHashMap方法,该方法采用映射并将所有条目添加到新条目WeakHashMap中并返回该映射。

于 2013-04-09T14:09:50.317 回答
0

您不能将 a 强制Map转换为 a,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"));
于 2013-04-09T14:12:13.880 回答