当我将 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
,所以你不能把它投给它。
HashMap
是HashMap
,所以你可以投掷它。
在您的示例中,如果需要,最好转换为 Map
,因为它允许您使用任何实现。
Hashmap
不同步,因此当Map
是interface
时,它不能强制转换为同步映射,因此它返回的同步 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。