在Java
中,拥有共享存储空间:
final Map<String, Car> cars = (numberOfThreads == 1)
? new HashMap<String, Car>()
: new ConcurrentHashMap<String, Car>();
然后在线程工作者类的run()
方法中,我想将并发数据存储到cars
映射中。为此,我需要向下转换为适当的hashmap实例。我可以使用if (numberOfThreads == 1)
,但我想可以反映cars
对象 - 我如何在这里使用Java Reflection API?
我收到此错误:The method putIfAbsent(String, Car) is undefined for the type Map<String, Car>
所以我不得不低估。
答案 0 :(得分:3)
您问题的简单答案:
if (cars instanceof ConcurrentMap) {
((ConcurrentMap)cars).putIfAbsent(key, value);
}
但是,在Java 8中Map
interface now has putIfAbsent()
,因此如果您可以升级JDK,则不需要进行此转换。
如果您不能使用Java 8,我建议您始终使用ConcurrentMap
,因为这种instanceof
代码不值得权衡。
在任何情况下,Java反射API都不适合这种情况。
答案 1 :(得分:1)
你不需要向下转换,只需使用Map put方法,不需要做任何其他事情。
由于问题发生了变化,因此没有putIfAbsent方法。没有看到代码,人们只能猜测。
最后你确定你需要putIfAbsent,如果你把同一辆车放两次会有问题吗?