TreeMap.keyset方法返回的是接口set,为什么该set里面可以储存对应的值,接口不是不能当对象使用的吗?

qq_35892617 2016-08-31 05:42:51
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(90,"语文");
map.put(82,"数学");
map.put(77,"英语");
map.put(83,"物理");
map.put(93,"生物");
map.put(70,"体育");
map.put(98,"计算机");
Set<Integer> kyeset = map.keySet();



TreeMap.keyset方法返回的是接口set,为什么该set里面可以储存对应的值,能够存储值的不是只有对象吗?接口不是不能当对象使用的吗?
如题,高手回答下。谢谢了
...全文
315 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
ctrl+鼠标左键点击KeySet方法进去后发现KeySet方法的定义如下: public Set<K> keySet() { Set<K> ks = keySet; //再次发现KeySet()方法返回值与KeySet这个对象有关 if (ks == null) { ks = new KeySet(); keySet = ks; } return ks; } //点击KetSet对象进入AbstractMap类,HashMap继承了这个类 //这里运用到了new AbstractSet<K>() {。。。};匿名类的使用,ks得到一个AbstractMap匿名对象,再把这个对象赋给KetSet,通过KetSet方法返回。 public Set<K> keySet() { Set<K> ks = keySet; if (ks == null) { ks = new AbstractSet<K>() { public Iterator<K> iterator() { return new Iterator<K>() { private Iterator<Entry<K,V>> i = entrySet().iterator(); public boolean hasNext() { return i.hasNext(); } public K next() { return i.next().getKey(); } public void remove() { i.remove(); } }; } public int size() { return AbstractMap.this.size(); } public boolean isEmpty() { return AbstractMap.this.isEmpty(); } public void clear() { AbstractMap.this.clear(); } public boolean contains(Object k) { return AbstractMap.this.containsKey(k); } }; keySet = ks; } return ks; }
李大白白 2016-09-01
  • 打赏
  • 举报
回复
创建一个接口,相当于创建了一个接口的实现类
qq_35892617 2016-09-01
  • 打赏
  • 举报
回复
本身返回的是一个实现父类接口的类····我不需要实际了解这个类具体是那个类就ok了对吧?
qq_35892617 2016-09-01
  • 打赏
  • 举报
回复
接口里面也是可以储存元素的吗?
soton_dolphin 2016-08-31
  • 打赏
  • 举报
回复
map.keySet(); 返回的是对Set 接口的一个实现实例,但是你没有必要知道这个实现实例的具体是哪个类
rickylin86 2016-08-31
  • 打赏
  • 举报
回复
实际上只是用父类来引用子类而已.本身返回的是一个具体的类,只是用接口(父类)引用

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧