博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么HashMap继承了AbstractMap还要实现Map接口
阅读量:4297 次
发布时间:2019-05-27

本文共 1137 字,大约阅读时间需要 3 分钟。

jdk中HashMap的声明如下
     public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
AbstractMap的声明如下
     public abstract class AbstractMap<K,V> implements Map<K,V>
这就让人很奇怪了,AbstractMap是实现了Map接口的,HashMap的声明中为什么还要写上实现Map接口(类似的还有很多啊,Java集合类中很多都是这样)?
目前看过几种答案,觉得就下面两个站得住脚:
1、添加Map接口声明是为了Class类的getInterfaces这个方法能够直接获取到Map接口;
2、这就是一个写法上的错误,并没有深意。
说维护性的,这样做并没有提升什么维护性。有人说可能以后中间的抽象类会废弃,废弃一个抽象类有什么用,直接把方法实现都去掉不就行了。就算是废弃了也不影响啊,废弃了我在这里写个非public的空的抽象类,估计就改下import就完事了。除非是整个集合类框架大改,否则这写抽象类是不会被废弃了。
可读性的,这样反而降低了可读性,你看到这个可能会考虑下HashMap中的put方法到底是哪个的,是AbstraceMap的,还是Map的,实际上这样的层次效果跟单独继承Map一样。
Class类的getInterfaces这个方法的确不能获取到父类实现的接口,如果不写上实现Map接口,这个方法返回的数组中就没有Map.class。
这个理由说得通,因为这样的确在实际中能发挥用,但是我本人还没想到这样做的用处。想想getInterfaces这个方法在哪里用到,判断类型会用isInstance或者instance of,不用接口遍历啊,我自己写的代码中也就jdk动态代理中会用到这个方法,为了动态代理Map而写上implements Map的确可以。不过后来发现这么做可能性不大 ,因为HashMap等集合类是Java1.2中有的,使用jdk动态代理的两个核心类java.lang.reflect.Proxy和java.lang.reflect.InvacationHandler是jdk1.3才有的。所以说第一个答案虽然有理,但是也不怎么有理。
第二个答案,这个倒是找到了依据,具体可以看下这个
得票最高的答案的回答者说他问了当初写这段代码的 Josh Bloch,得知这就是一个写法错误,我了个去
好吧,这个问题就告一段落了
总结下,平时不要像这么写,因为的确没有用,除非你真在某些方面及其依赖Class类getInterefaces方法的结果。

转载地址:http://grcws.baihongyu.com/

你可能感兴趣的文章
史丹·温斯坦称傲牛熊市的秘密
查看>>
期货市场技术分析01_理论基础
查看>>
期货市场技术分析02_趋势的基本概念
查看>>
期货市场技术分析03_主要反转形态
查看>>
期货市场技术分析04_持续形态
查看>>
期货市场技术分析05_交易量和持仓兴趣
查看>>
TB交易开拓者入门教程
查看>>
TB创建公式应用dll失败 请检查用户权限,终极解决方案
查看>>
python绘制k线图(蜡烛图)报错 No module named 'matplotlib.finance
查看>>
talib均线大全
查看>>
期货市场技术分析06_长期图表和商品指数
查看>>
期货市场技术分析07_摆动指数和相反意见理论
查看>>
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
X 分钟速成 Python
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
网格马丁格尔交易法
查看>>
一行代码让 Python 的运行速度提高100倍
查看>>
一行 Python 实现并行化 -- 日常多线程操作的新思路
查看>>