SortedMap <string,string =“”>,需要SortedMap <string,serializable>。怎么办?</string,serializable> </string,>

时间:2014-08-08 07:28:00

标签: java generics collections casting

这个问题关于Java中的gernerics,type-safty和Collection类:

正如标题所说:我有一个返回集合SortedMap<String,String>的方法,我将其从methodStrStr()作为返回值检索。假设我从methodStrSer()调用此方法,只需要传递检索到的地图,但必须返回SortedMap<String,Serializable>

这样做的优雅计算方法是什么?

如果没有泛型,我会返回原始地图,StringSerializable。但是我发现如果SortedMap的底层实现特定于String个对象,我可能会在运行时遇到麻烦,如果我想添加一个不同的类型对象,例如{{1 }}也是Boolean但不是Serializable。所以我知道有意义的是,编译器不允许将String作为SortedMap<String,String>返回。

然而,问题仍然存在。是否有一种可接受的方式来进行somhow&#34;转换&#34; (即一种不将 O(N)时间)原始地图类型转换为目标类型的方式?

1 个答案:

答案 0 :(得分:3)

有几种选择:

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

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

SortedMap<String, String> oldMap = ...;
SortedMap<String, Serializable> newMap = 
    Collections.<String, Serializable>unmodifiableSortedMap(oldMap);

这是安全的,因为地图是不可修改的,因此不能被污染&#34; Serializable对象不是String。 (一个简单的强制转换,产生一个可修改的映射,当然是类型安全的 - 请参阅this answer以获取示例)。