Collections.syncdMap( ) 返回类转换异常,其中正常映射工作正常



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

根据我的理解,Collections.syncdMap( ( 也返回 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);
   }
 }

好的,如果它的同步映射并抛出类转换异常,我可以将此同步映射转换为哈希映射。

Collections.synchronizedMap(m)不返回HashMap,所以你不能把它投射到HashMap。它返回一个SynchronizedMap实例。

您可以将其分配给Map

Map smap = Collections.synchronizedMap(m);

在您的"法线贴图"示例中:

HashMap hm = (HashMap)(m);

不是"普通地图"。没有"普通地图"这样的东西。

您可以在此处为其分配一个HashMap实例:

Map m = new HashMap();

这是您以后可以将其投射到HashMap的唯一原因。

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

HashMap hm = (HashMap)(m)

工作只是因为m的实际具体类是哈希映射。如果您使用 m初始化,它将不起作用

Map m = new TreeMap();

例如。

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

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

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

SynchronizedMap不是HashMap,所以你不能把它投给它。

HashMapHashMap,所以你可以投掷它。

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

Hashmap 不同步,因此当Mapinterface时,它不能强制转换为同步映射,因此它返回的同步 Map 类型Map因此可以大小写为Map

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

但你可以这样做:

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

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

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

SyncdMap 实现了 Map 接口,但它不是 HashMap 的子类。因此,将 SyncdMap 转换为 HashMap 将导致 ClassCastException。

最新更新