Java 下推番石榴地图类
我在一个使用guava数据类型的系统中工作了大约一个月Java 下推番石榴地图类,java,guava,Java,Guava,我在一个使用guava数据类型的系统中工作了大约一个月 ImmutableMap<String, Object> ImmutableMap 一切都很好,连我的开发者都喜欢。太棒了。直到昨天。我们有一个记录集,必须作为ImmutableListMultimap引入,并且必须将其强制转换为ImmutableMap类型 这是我们的编译错误 ImmutableListMultimap<String, Object> tst = new bla bla bla;
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
,而不是强制转换。这实际上不会执行复制,因为它可以检测到这将是冗余的,但它将使用ImmutableMapImmutableMap tst2=…
?毕竟,ImmutableMap
和ImmutableMap
是不相关的类型。演员阵容如何成为一个月工作的关键成果?这是个好主意,我将尝试一下,看看是否有任何副作用。不确定它是否会破坏我们已经拥有的任何东西,因为有很多代码需要重做、重新思考、重新测试、更新单元测试以考虑多种类型等等。我们现在无法承受这样的更改,没有时间。那么ImmutableMap tst2=…
呢?毕竟,ImmutableMap
和ImmutableMap
是不相关的类型。演员阵容如何成为一个月工作的关键成果?这是个好主意,我将尝试一下,看看是否有任何副作用。不确定它是否会破坏我们已经拥有的任何东西,因为需要重做、重新思考、重新测试、更新单元测试以考虑多种类型,等等。我们现在负担不起这样的更改,没有时间。哈!!令人惊叹的。我不知道你可以这样做。非常感谢你!!这真的比只使用通配符简单吗?一旦你抑制了警告等,你就有了一个更详细的解决方案。@Andy Turner OP明确写了“现在执行此强制转换不是一个选项”,所以我假设他们想要对象而不是?
。否则,它们可以坚持使用集合
,并且没有任何问题。@maaartinus要将值用作对象
的实例,您不需要强制转换。请参阅下面的代码。哈!!令人惊叹的。我不知道你可以这样做。非常感谢你!!这真的比只使用通配符简单吗?一旦你抑制了警告等,你就有了一个更详细的解决方案。@Andy Turner OP明确写了“现在执行此强制转换不是一个选项”,所以我假设他们想要对象而不是?
。否则,它们可以坚持使用集合
,并且没有任何问题。@maaartinus要将值用作对象
的实例,您不需要强制转换。请参阅下面的代码.upvote,因为没有类型安全警告,而且它是不可变的,所以不需要在通配符上添加不允许的内容。这对我来说毫无意义。如果