当我将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和throws类转换异常可以将此SynchronizedMap转换为HashMap。
答案 0 :(得分:2)
Collections.synchronizedMap(m)
未返回HashMap
,因此您无法将其投放到HashMap
。它返回SynchronizedMap
个实例。
您可以将其分配到Map
:
Map smap = Collections.synchronizedMap(m);
在“普通地图”示例中:
HashMap hm = (HashMap)(m);
不是“普通地图”。没有“普通地图”这样的东西。
您可以在此处为其分配HashMap
个实例:
Map m = new HashMap();
这是您稍后可以将其投放到HashMap
的唯一原因。
答案 1 :(得分:1)
它返回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);
答案 2 :(得分:0)
Map
是界面。 HashMap
是一个实现,SynchronizedMap
是另一个实现。
SynchronizedMap
不是HashMap
,因此您无法将其投射到它。
HashMap
是HashMap
,因此您可以投射它。
在您的示例中,如果需要,最好转换为Map
,因为它允许您使用任何实现。
答案 3 :(得分:0)
Map
未同步,因此在interface
为Map
时无法转换为同步映射,因此无论何种类型的同步映射返回它都会实现Map
所以可以加入<div class="col-md-12 tableContainer">
<table class="table table-hover table-condensed">
<thead>
<tr>
<th class="hidden-xs"></th>
<th></th>
<th>Artist</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
答案 4 :(得分:0)
SynchronizedMap
会返回与HashMap
实施不同的实施方式,因此您无法将其投放到HashMap
。
但你可以这样做:
Map<String, String> m = new HashMap<String, String>();
m.put("sachin", "sacjdeva");
Map<String, String> hm = Collections.synchronizedMap(m);
答案 5 :(得分:0)
Collections.synchronizedMap(Map)返回SynchronizedMap的一个实例,它是Collections类的内部类。下面的代码将获得返回的实际类名。
System.out.println(Collections.synchronizedMap(m).getClass().getName());
SynchronizedMap实现了Map接口,但它不是HashMap的子类。因此,将SynchronizedMap强制转换为HashMap将导致ClassCastException。