keySet()返回java.util.Set。
为什么不强制转换为NavigableSet抛出ClassCastException?
如果real Object是带有java.util.Set引用的TreeSet,则可能是这样。我不明白。

import java.util.*;
class A1{}
public class Main{
     public static void main(String args[]){
         SortedMap nvs=new TreeMap();
         nvs.put(1,"one");
         nvs.put(2,"two");
         nvs.put(3,"three");
         nvs.put(4,"four");
         NavigableSet nss=(NavigableSet)nvs.keySet();
         for(Object ob: nss){
              System.out.print(nvs.get(ob)+", ");
         }
     }
}

最佳答案

最好的办法是查看TreeMap的实际代码(来自Java 1.7):

public Set<K> keySet() {
    return navigableKeySet();
}

public NavigableSet<K> navigableKeySet() {
    KeySet<K> nks = navigableKeySet;
    return (nks != null) ? nks : (navigableKeySet = new KeySet(this));
}


这是KeySet类声明:

static final class KeySet<E> extends AbstractSet<E> implements NavigableSet<E> {...}


如您所见,TreeMap#keySet方法返回类型Set,它是NavigableSet的超级接口。从中返回的Set引用指向KeySet实例,如navigableKeySet()方法中一样。

由于KeySet类实现了NavigableSet,因此您始终可以将指向其实例的引用转换为NavigableSet引用。

只是为了确保您独立于keySet()方法的实现,您可以简单地调用navigableKeySet()方法来获取NavigableSet并避免强制转换

10-06 04:11