Java 下推番石榴地图类

Java 下推番石榴地图类,java,guava,Java,Guava,我在一个使用guava数据类型的系统中工作了大约一个月 ImmutableMap<String, Object> ImmutableMap 一切都很好,连我的开发者都喜欢。太棒了。直到昨天。我们有一个记录集,必须作为ImmutableListMultimap引入,并且必须将其强制转换为ImmutableMap类型 这是我们的编译错误 ImmutableListMultimap<String, Object> tst = new bla bla bla;

我在一个使用guava数据类型的系统中工作了大约一个月

ImmutableMap<String, Object>
ImmutableMap
一切都很好,连我的开发者都喜欢。太棒了。直到昨天。我们有一个记录集,必须作为ImmutableListMultimap引入,并且必须将其强制转换为ImmutableMap类型

这是我们的编译错误

ImmutableListMultimap<String, Object> tst = new bla bla bla;
        ImmutableMap<String, Object> tst2 = (ImmutableMap<String, Object>) tst.asMap();
ImmutableListMultimap tst=新bla bla bla bla;
ImmutableMap tst2=(ImmutableMap)tst.asMap();
错误本身是错误的

Cannot cast from ImmutableMap<String,Collection<Object>> to ImmutableMap<String,Object>
无法从ImmutableMap强制转换为ImmutableMap
现在做这个演员不是一个选择。必须完成,否则我们必须回去重新设计一个月的工作。不会发生的。我现在唯一能解决这个问题的方法是构建一个工厂类,该类迭代
tst
变量,将值重新编译为基本对象,并将其转储到
tst2
中。但是,这个tst变量可能包含数千个条目,这使得该解决方案不明智

另一个选择是ApacheCollections转换,但由于这些转换也只是迭代器,所以我并没有得到多少好处


我能做些什么更优雅的事情来贬低泛型,还是Sun关于泛型类型擦除的卓越概念注定了我的命运。

这不是一个很好的理由,但有一个简单的解决方法:

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

这看起来可能有点理智:

    ImmutableListMultimap<String, Object> tst = ...
    ImmutableMap<String, ? extends Collection<Object>> asMap = tst.asMap();
    @SuppressWarnings("unchecked")
    ImmutableMap<String, Object> tst2 = (ImmutableMap<String, Object>) asMap;
ImmutableListMultiMapTST=。。。
ImmutableMap asMap=tst.asMap();
@抑制警告(“未选中”)
ImmutableMap tst2=(ImmutableMap)asMap;

通用系统并不完美(如果是的话,它会更复杂),有时很难理解。由于不变性,上面未经检查的强制转换是安全的:无法放入
对象
(这将违反
映射
签名)。

无法强制转换,原因很好,但有一个简单的解决方法:

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

这看起来可能有点理智:

    ImmutableListMultimap<String, Object> tst = ...
    ImmutableMap<String, ? extends Collection<Object>> asMap = tst.asMap();
    @SuppressWarnings("unchecked")
    ImmutableMap<String, Object> tst2 = (ImmutableMap<String, Object>) asMap;
ImmutableListMultiMapTST=。。。
ImmutableMap asMap=tst.asMap();
@抑制警告(“未选中”)
ImmutableMap tst2=(ImmutableMap)asMap;

通用系统并不完美(如果是的话,它会更复杂),有时很难理解。由于不变性,上面未选中的强制转换是安全的:无法放入
对象
(这将违反
映射
签名)。

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

ImmutableMap<String, Object> tst2 = ImmutableMap.<String, Object>copyOf(tst.asMap());
值是通配符类型这一事实不应影响您对映射值执行任何操作的能力,例如
对象
s:

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

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

ImmutableMap<String, Object> tst2 = ImmutableMap.<String, Object>copyOf(tst.asMap());
值是通配符类型这一事实不应影响您对映射值执行任何操作的能力,例如
对象
s:

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


因此,一种不会生成任何编译警告的方法是使用
ImmutableMap.copyOf
,而不是强制转换。这实际上不会执行复制,因为它可以检测到这将是冗余的,但它将采用
ImmutableMap,因此,一种不会生成任何编译警告的方法是使用
ImmutableMap.copyOf
,而不是强制转换。这实际上不会执行复制,因为它可以检测到这将是冗余的,但它将使用
ImmutableMap
ImmutableMap tst2=…
?毕竟,
ImmutableMap
ImmutableMap
是不相关的类型。演员阵容如何成为一个月工作的关键成果?这是个好主意,我将尝试一下,看看是否有任何副作用。不确定它是否会破坏我们已经拥有的任何东西,因为有很多代码需要重做、重新思考、重新测试、更新单元测试以考虑多种类型等等。我们现在无法承受这样的更改,没有时间。那么
ImmutableMap tst2=…
呢?毕竟,
ImmutableMap
ImmutableMap
是不相关的类型。演员阵容如何成为一个月工作的关键成果?这是个好主意,我将尝试一下,看看是否有任何副作用。不确定它是否会破坏我们已经拥有的任何东西,因为需要重做、重新思考、重新测试、更新单元测试以考虑多种类型,等等。我们现在负担不起这样的更改,没有时间。哈!!令人惊叹的。我不知道你可以这样做。非常感谢你!!这真的比只使用通配符简单吗?一旦你抑制了警告等,你就有了一个更详细的解决方案。@Andy Turner OP明确写了“现在执行此强制转换不是一个选项”,所以我假设他们想要
对象而不是
。否则,它们可以坚持使用
集合
,并且没有任何问题。@maaartinus要将值用作
对象
的实例,您不需要强制转换。请参阅下面的代码。哈!!令人惊叹的。我不知道你可以这样做。非常感谢你!!这真的比只使用通配符简单吗?一旦你抑制了警告等,你就有了一个更详细的解决方案。@Andy Turner OP明确写了“现在执行此强制转换不是一个选项”,所以我假设他们想要
对象而不是
。否则,它们可以坚持使用
集合
,并且没有任何问题。@maaartinus要将值用作
对象
的实例,您不需要强制转换。请参阅下面的代码.upvote,因为没有类型安全警告,而且它是不可变的,所以不需要在通配符上添加不允许的内容。这对我来说毫无意义。如果