【问题标题】:Collections.synchronizedMap( ) returns class cast exception where as normal map works fineCollections.synchronizedMap() 返回类转换异常,而法线贴图工作正常
【发布时间】:2015-10-20 06:22:14
【问题描述】:

当我将 Collections.synchronizedMap() 转换为哈希映射时,它会返回类转换异常,但是当我将 Map 转换为哈希映射时,它工作正常。

据我了解,Collections.synchronizedMap() 也返回 map 。

那为什么我会得到这个异常。

如何克服它。

示例代码

 public class Main_1 {
  public static void main(String[] args) throws UnknownHostException, IOException {
    Map m = new HashMap();
    m.put("sachin", "sacjdeva");
     // Throws exception here 
    HashMap hm = (HashMap) Collections.synchronizedMap(m);
    //No exception
    HashMap hm = (HashMap)(m)
    System.out.println(hm);
   }
 }

好的,如果它的 synchronizedMap 并抛出类转换异常,我可以将此 SynchronizedMap 转换为 HashMap。

【问题讨论】:

标签: java collections


【解决方案1】:

Collections.synchronizedMap(m) 不返回 HashMap,因此您不能将其转换为 HashMap。它返回一个SynchronizedMap 实例。

您可以将其分配给Map

Map smap = Collections.synchronizedMap(m);

在您的“法线地图”示例中:

HashMap hm = (HashMap)(m);

不是“普通地图”。没有“普通地图”之类的东西。

您在这里为其分配一个HashMap 实例:

Map m = new HashMap();

这是您以后可以将其转换为 HashMap 的唯一原因。

【讨论】:

  • 我知道我不返回哈希映射它只返回映射。
  • @ShowStopper 我不只是指该方法的返回类型,即Map,我指的是该方法返回的实际Map 实现,即@987654333 @,因此不能转换为HashMap
【解决方案2】:

它返回Map 的实例,即实现Map 接口的类的实例(您不需要知道)。您无需将其强制转换为 HashMap,它是实现相同 Map 接口的另一个类。

HashMap hm = (HashMap)(m)

之所以起作用,是因为m 的实际具体类是HashMap。如果你用

初始化m 就不行了
Map m = new TreeMap();

例如。

您应该针对接口进行编程,而不是针对具体类型进行编程。您的变量应该是Map 类型。您还应该避免使用原始类型,并指定映射的泛型参数:

Map<String, String> map = new HashMap<>();
m.put("sachin", "sacjdeva");
Map<String, String> synchronizedMap = Collections.synchronizedMap(m);

【讨论】:

    【解决方案3】:

    Map 是接口。 HashMap 是一种实现,SynchronizedMap 是另一种实现。

    SynchronizedMap 不是 HashMap,因此您不能将其转换为它。

    HashMapHashMap,所以你可以投射它。

    在您的示例中,如果需要,最好转换为 Map,因为它允许您使用任何实现。

    【讨论】:

    【解决方案4】:

    Hashmap 未同步,因此无法转换为同步映射,而Mapinterface,因此无论返回的同步映射类型如何,它都实现了Map,因此可以转换为Map

    【讨论】:

      【解决方案5】:

      SynchronizedMap 返回与HashMap 实现不同的实现,因此您不能将其转换为HashMap

      但你可以这样做:

      Map<String, String> m = new HashMap<String, String>();
      m.put("sachin", "sacjdeva");
      
      Map<String, String> hm = Collections.synchronizedMap(m);
      

      【讨论】:

      • 错了,你不能。这仍然会将同步的 Map 转换为 HashMap。
      【解决方案6】:

      Collections.synchronizedMap(Map) 返回一个 SynchronizedMap 的实例,它是 Collections 类的内部类。以下代码将获得返回的实际类名。

      System.out.println(Collections.synchronizedMap(m).getClass().getName());
      

      SynchronizedMap 实现了 Map 接口,但它不是 HashMap 的子类。所以将 SynchronizedMap 转换为 HashMap 会导致 ClassCastException。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-07
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2016-11-23
        相关资源
        最近更新 更多