【问题标题】:Have SortedMap<String, String>, need SortedMap<String,Serializable>. What to do?有 SortedMap<String, String>,需要 SortedMap<String,Serializable>。该怎么办?
【发布时间】:2014-10-01 14:47:36
【问题描述】:

这个问题是关于 Java 中的泛型、类型安全和 Collection 类:

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

什么是优雅的非计算成本高的方法?

如果没有泛型,我只会返回原始地图,因为 StringSerializable。但是我发现如果SortedMap 的底层实现特定于String 对象并且如果我想添加不同类型的对象(例如Boolean 这也是@)导致错误,我可能会在运行时遇到麻烦987654330@ 但不是String。所以我知道编译器不允许将SortedMap&lt;String,String&gt; 作为SortedMap&lt;String,Serializable&gt; 返回是有道理的。

但是,我的问题仍然存在。是否有一种可接受的方式将原始地图类型“转换”为目标类型?

【问题讨论】:

  • 也许您可以将方法签名更改为返回/接受SortedMap&lt;String, ? extends Serializable&gt;

标签: java generics collections casting


【解决方案1】:

有几种选择:

  • 复制地图 - 不推荐,因为它可能很昂贵且没有必要
  • 正如 izstas 建议的那样:将接收方的签名更改为接受 SortedMap&lt;String, ? extends Serializable&gt;(另见 What is PECS (Producer Extends Consumer Super)?
  • 只需在地图上提供适当的视图

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

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

这是安全的,因为地图是不可修改的,因此不能被不是StringSerializable 对象“污染”。 (导致可修改映射的简单转换当然不是类型安全的 - 请参阅 this answer 了解示例原因)。

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2016-07-25
    • 1970-01-01
    • 2010-12-02
    • 2016-03-26
    相关资源
    最近更新 更多