Collections.synchronizedMap()返回类强制转换异常,因为普通映射工作正常

时间:2015-10-20 06:22:15

标签: java collections

当我将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。

6 个答案:

答案 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,因此您无法将其投射到它。

HashMapHashMap,因此您可以投射它。

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

答案 3 :(得分:0)

Map未同步,因此在interfaceMap时无法转换为同步映射,因此无论何种类型的同步映射返回它都会实现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。