【发布时间】:2011-08-17 17:36:02
【问题描述】:
假设我有一个这样的类:
public class MyMap<K, V> implements Map<Set<K>, V> {
...
}
我希望能够对其强制同步。一种方法是在内部同步方法(可能使用同步关键字),但如果我打算将其用于更一般的用途,那么使用外部同步可能会更好,也许使用 Collections.synchronizedMap() 方法。
问题出现在我尝试实现这个的类中:假设我有以下类:
public class Foo {
MyMap<String, Object> _myMap;
public Foo() {
_myMap = Collections.synchronizedMap(new MyMap<String, Object>());
}
}
在课程的第 4 行,我收到错误“类型不匹配:无法从 Map
_myMap = (MyMap<String, Object>) Collections.synchronizedMap(new MyMap<String, Object>);
代码实际执行时出现以下错误:
java.lang.ClassCastException: java.util.Collections$SynchronizedMap cannot be cast to ****.MyMap
似乎 synchronizedMap() 正在向下转换(?) MyMap 到它的“真实”类型,即 Map
有没有办法绕过这些来破解 synchronizedMap 以使用这种类?如果没有,实现外部或同步的推荐方法是什么?
也许作为一个后续问题,这种实现类型参数不是简单类型的接口的方法(例如第一个Map参数中的非平凡SetMap< Set< K>, V> 的东西,实现类也可以有除
在一个完全不相关的旁注中,有谁知道我如何绕过奇怪的标签捕获(这样我就不必放置像“Map
【问题讨论】:
-
MyMap 做了哪些 HashMap、TreeMap、LinkedHashMap 没有做的事情?为什么需要一个特定的类而不是标准的 Map 接口?
-
为什么
Foo有MyMap的构造函数?它应该是Foo构造函数吗? -
忽必烈汗-很好,我的错字。 JB Nizet——如果你真的想知道,map 键是 Set
是有原因的——我之前的一个问题可能会为那些好奇的人提供更多的启示 :)。当然,如果 Java SDK 或 Google 的 Guava Collections 下的任何现有 Maps 实现了类似的目的,我会使用它们而不是尝试创建一个新的。 -
为什么不直接使用 Map
, Object>。为什么需要特定的自定义实现?
标签: java generics synchronization