在 Java 中反映贴图
Reflect Map in Java
在Java
,共享存储:
final Map<String, Car> cars = (numberOfThreads == 1)
? new HashMap<String, Car>()
: new ConcurrentHashMap<String, Car>();
然后在线程工作者的 run()
方法中 class 我想同时将数据存储到 cars
映射中。为此,我需要向下转换为适当的哈希图实例。我可以使用 if (numberOfThreads == 1)
但我想它可以反射 cars
对象 - 我如何在这里使用 Java 反射 API?
我收到这个错误:The method putIfAbsent(String, Car) is undefined for the type Map<String, Car>
所以我不得不沮丧。
不用downcast,直接用Map put方法即可,其他什么都不用做。
既然问题改了,是的,没有putIfAbsent方法。没有看到代码,只能猜测。
最后你确定需要putIfAbsent吗,同一个车放两次会不会有问题?
您问题的简单答案:
if (cars instanceof ConcurrentMap) {
((ConcurrentMap)cars).putIfAbsent(key, value);
}
但是,在 Java 8 Map
interface now has putIfAbsent()
中,如果您可以升级 JDK,则不需要此转换。
如果你不能使用 Java 8 我建议一直使用 ConcurrentMap
,因为这种 instanceof
代码不值得权衡。
无论如何,Java 反射 API 不适合这种情况。
在Java
,共享存储:
final Map<String, Car> cars = (numberOfThreads == 1)
? new HashMap<String, Car>()
: new ConcurrentHashMap<String, Car>();
然后在线程工作者的 run()
方法中 class 我想同时将数据存储到 cars
映射中。为此,我需要向下转换为适当的哈希图实例。我可以使用 if (numberOfThreads == 1)
但我想它可以反射 cars
对象 - 我如何在这里使用 Java 反射 API?
我收到这个错误:The method putIfAbsent(String, Car) is undefined for the type Map<String, Car>
所以我不得不沮丧。
不用downcast,直接用Map put方法即可,其他什么都不用做。
既然问题改了,是的,没有putIfAbsent方法。没有看到代码,只能猜测。
最后你确定需要putIfAbsent吗,同一个车放两次会不会有问题?
您问题的简单答案:
if (cars instanceof ConcurrentMap) {
((ConcurrentMap)cars).putIfAbsent(key, value);
}
但是,在 Java 8 Map
interface now has putIfAbsent()
中,如果您可以升级 JDK,则不需要此转换。
如果你不能使用 Java 8 我建议一直使用 ConcurrentMap
,因为这种 instanceof
代码不值得权衡。
无论如何,Java 反射 API 不适合这种情况。