首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有SortedMap<String,String>,需要SortedMap<String,Serializable>。该怎么办呢?

有SortedMap<String,String>,需要SortedMap<String,Serializable>。该怎么办呢?
EN

Stack Overflow用户
提问于 2014-08-08 07:27:59
回答 1查看 196关注 0票数 2

这个问题涉及Java中的老年学、类型安全和集合类:

正如标题所述:我有一个返回集合的方法,SortedMap<String,String>,作为返回值从methodStrStr()中检索。假设我从methodStrSer()调用这个方法,它只需要传递检索到的映射,但必须返回SortedMap<String,Serializable>

,什么是一种优雅的、非计算上昂贵的方法?

如果没有泛型,我只会返回原始地图,因为StringSerializable。但是,如果SortedMap的底层实现是特定于String对象的,如果我想添加一个不同的类型化对象,比如Boolean,它也是Serializable,而不是String,那么我可能会在运行时遇到麻烦。因此,我知道这是合理的,编译器不允许将SortedMap<String,String>作为SortedMap<String,Serializable>返回。

然而,我的问题仍然存在。是否有一种可以接受的方法来“转换”(即不花费O(N)时间的方式)原始映射类型到目标类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-08 08:44:54

有几种选择:

  • 复制地图-不推荐,因为它可能是昂贵和不必要的。
  • 正如izstas所建议的:将接收方的签名更改为接受SortedMap<String, ? extends Serializable> (也请参见What is PECS (Producer Extends Consumer Super)? )
  • 只需在地图上提供适当的视图即可。

后者可能是这里最合适的。你可以简单地写

代码语言:javascript
复制
SortedMap<String, String> oldMap = ...;
SortedMap<String, Serializable> newMap = 
    Collections.<String, Serializable>unmodifiableSortedMap(oldMap);

这是安全的,因为映射是不可修改的,因此不会被非StringString对象“污染”。(一个简单的转换,产生一个可修改的地图,当然不会是类型安全-参见this answer的例子,为什么)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25198127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档