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
并避免强制转换