java - 向下转型 Guava map 类

标签 java guava

我对一个使用 Guava 数据类型的系统进行了大约一个月的工作

ImmutableMap<String, Object>

一切都很好,甚至我的开发人员也喜欢它。这很棒。直到昨天。我们有一个记录集,必须将其作为 ImmutableListMultimap 引入,并且必须将其转换为 ImmutableMap 类型。

这是我们的编译错误

ImmutableListMultimap<String, Object> tst = new bla bla bla;
        ImmutableMap<String, Object> tst2 = (ImmutableMap<String, Object>) tst.asMap();

错误本身是

Cannot cast from ImmutableMap<String,Collection<Object>> to ImmutableMap<String,Object>

现在进行此转换不是一个选择。它必须完成,否则我们必须回去重新设计一个月的工作。不会发生。我现在解决这个问题的唯一选择是构建一个工厂类来迭代 tst 变量,将值重新转换为基本对象并将其转储到 tst2 中。但是,这个 tst 变量可能包含数千个条目,这使得该解决方案不明智。

另一个选择是 Apache Collections Transforms,但由于它们也只是迭代器,所以我没有获得太多 yield 。

是否有什么更优雅的方法可以让我对泛型进行向下转换,或者 Sun 出色的泛型类型删除概念注定了我的失败。

最佳答案

您可以使用ImmutableMap.copyOf方法,具有明确的约束:

ImmutableMap<String, Object> tst2 = ImmutableMap.<String, Object>copyOf(tst.asMap());

请注意这个doesn't necessarily copy the map - 在某些(许多)情况下,tst == tst2 (它们是相同的引用)。

如果您绝对必须避免复制 map ,则需要使用通配符类型,因为 ImmutableMap<K, Object>ImmutableMap<K, Collection<Object>>不是相关类型:

ImmutableMap<String, ?> tst2 = tst.asMap();

该值是通配符类型这一事实不应影响您使用 Object 等 map 值执行任何操作的能力s:

for (Map.Entry<String, ?> entry : tst2.entrySet()) {
  Object value = entry.getValue();
  //...
}

关于java - 向下转型 Guava map 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599129/

相关文章:

java - 为循环中的每个文本字段创建具有唯一名称的文本字段

java - 如何让 GridPane 充满整个场景? (带有 Eclipse Luna 的 JavaFX SceneBuilder)

java - Lists.newArrayList 与新的 ArrayList

java - 根据 id 返回列表的元素

java - Guava 缓存 : how to set expiration on 'CacheLoader.load()' instead of during CacheBuilder. newBuilder()?

java - 多线程环境中的快速 MultiMap

java - 应用级线程池和tomcat

java - @Formula 从 spring data jpa 中的 @OneToMany 关联中计数对象

java - ExecutorService 不起作用,但单独创建线程可以

java - guava的cacheloader加载方法有更多参数吗?