【问题标题】:Cast TreeMap.Submap return: SortedMap, back to TreeMapCast TreeMap.Submap 返回:SortedMap,返回TreeMap
【发布时间】:2010-11-22 00:06:30
【问题描述】:

这对我来说似乎太棘手了,无法正确执行。

我有一个TreeMap<Double, (user-defined)Object>,我正在拍摄其中的一个子图:

        public static reqObj assignObj(reqObj vArg, int startDate, int endDate){
                reqObj vOut=new reqObj();



                if (keyAt(vArg.requestObject,startDate)>-1 && keyAt(vArg.requestObject,endDate)>-1){
                    System.err.println(keyAt(vArg.requestObject,startDate));
                    System.err.println(keyAt(vArg.requestObject,endDate));

                    //vOut.requestObject=(TreeMap<Double, dayObj>)

                    vArg.requestObject.subMap(
                            keyAt(vArg.requestObject,startDate),
                            keyAt(vArg.requestObject,endDate));

                }

                return vOut;
        } 

这按预期工作,但是当我将排序后的地图转换回 (TreeMap) 时,我收到以下错误:

  java.lang.ClassCastException: java.util.TreeMap$SubMap

任何帮助都会很棒。

【问题讨论】:

    标签: java treemap sortedmap


    【解决方案1】:

    问题正是错误所说的:返回的子图不是标准TreeMap,它是实现定义的内部类的实例。如果你看subMap的声明:

    public SortedMap subMap(Object fromKey, Object toKey)
    

    它只保证返回的对象实现SortedMap 接口,所以这是您唯一可以安全地转换为的对象。

    话虽如此,实际上没有理由强制转换为 TreeMap,因为它没有提供比 SortedMap 更多的功能。

    【讨论】:

    • 我猜简短的答案是“否”,而较长的答案只是让您的代码意识到如果它通过 .submap 发送 TreeMap 它应该准备好处理返回排序地图?
    • @jason m:这就是为什么通过接口处理对象总是好的原因,这样你就不必担心它是否真的是TreeMap或其他一些类。
    • 您是否介意推荐我在哪里可以阅读您所说的内容(re:通过接口处理对象?)那太好了。谢谢!
    • @jason m:这没什么好说的,但这里有一个非常简单的例子:Use interface references to Collections
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2011-03-03
    相关资源
    最近更新 更多