gpt4 book ai didi

java - 为什么不转换为 NavigableSet 抛出 ClassCastException?

转载 作者:行者123 更新时间:2023-11-29 03:39:40 25 4
gpt4 key购买 nike

keySet() 返回 java.util.Set。为什么不转换为 NavigableSet 抛出 ClassCastException?如果真实对象是具有 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 的超接口(interface)。并且从它返回的 Set 引用指向一个 KeySet 实例,如 navigableKeySet() 方法。

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

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

关于java - 为什么不转换为 NavigableSet 抛出 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13770129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com