gpt4 book ai didi

具有复杂类型定义的 Java Collections.synchronizedMap()

转载 作者:行者123 更新时间:2023-12-04 06:17:08 28 4
gpt4 key购买 nike

假设我有一个类:

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>());
}
}

在类(class)的第 4 行,我收到错误“类型不匹配:无法从 Map , Object> 转换为 MyMap ”。 Eclipse 建议我做以下两件事之一:要么向 MyMap 添加强制转换,要么将 _myMap 的类型更改为 Map , Object>。但是,我显然不想做后者,因为使用 MyMap 而不是 Map 的全部意义在于,我可以利用我在 MyMap 中实现的附加功能。然后,当我尝试按照他们的建议添加 Actor 时,现在该行看起来像
_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 ,Object>>,然后不允许我将它转换回 MyMap,这就是我传入 synchronizedMap() 的类型。

有没有办法解决这些问题来破解 synchronizedMap 以使用这种类?如果没有,实现外部或同步的推荐方法是什么?

也许作为一个后续问题,这种实现类型参数不是简单类型(例如第一个 Map 参数中的非平凡 Set )的接口(interface)的方法在实践中是否普遍使用?实现类(在本例中为 MyMap)是否可以使用简单类型以外的任何参数进行参数化 - 换句话说,即使一个正在实现类似 Map< Set< K>, V> 的东西,实现类是否可以将 以外的其他参数作为其参数(尽管还有其他未使用的参数)?

在一个完全不相关的旁注中,有没有人知道我如何绕过奇怪的标签捕获(这样我就不必放置像“Map ”这样的空格),即使我用 block 将它括起来?

最佳答案

如果您查看 Collections.synchronizedMap 的 javadocs(请参阅 here ),那么您将了解实际应该如何使用它以及它的作用。主要需要注意的是,您通过的 Map 被包装在 Map 的新同步实现中,并且此实现与 MyMap 不同,因此这就是显式转换失败的原因。

至于您的问题的解决方案,我不是 100% 确定您在寻找什么,但是一个简单的 ConcurrentHashMap 是否不够?看看here对于javadocs。

关于具有复杂类型定义的 Java Collections.synchronizedMap(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7097036/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com