点击上方“业余草”,选择“置顶公众号”
第一时间获取技术干货和业界资讯!
昨天太忙,回来的很晚。很多人私信我,我在睡前都一一回应了。今天由于比较匆忙,就把很久之前写的文章推荐给大家!
最近看了 Github 上很火的项目,star 超过了 vue。就想看看 github 的 star 排行榜,看完之后,我突然想到能不能看看 stackoverflow 上的排行榜。做一些翻译也很不错!
在打开 stackoverflow 的时候,突然看到一个很稀奇的问题。为什么Java中的Collection类都继承了抽象类还要实现了抽象类的接口?
Why do many Collection classes in Java extend the abstract class and implement the interface as well?
这是一个很好的问题,是一个我从来都没注意过和思考过的问题。
![16e2e8871710f0585f7451fbd451b9ec.png](https://i-blog.csdnimg.cn/blog_migrate/a2be31da64329fbefd15c063dfcc0068.jpeg)
大致给大家翻译一下,为什么要这样做?
Java 中其实有很多集合 Collection 都有这样的神操作。比如:HashSet 继承了 AbstractSet 并实现 Set,但 AbstractSet 已经实现 Set。HashMap extends AbstractMap,AbstractMap implements Map 等。
为什么要这样做呢?根据上面的解释,其中一个很重要的原因是:规范。如果不实现对应的抽象类也不会有影响,只是实现对应抽象类后能帮助我们理解代码,而无需通过给定类的完整层次结构。
第二个,在反射上可以观察到它们的差异。比如,下面的代码:
运行后,输出下面的结果:
通过上面的结果,你会发现,List 其实 extends Collection 接口,但是 Collection 接口并没被打印出来。也就是说上面的输出不包括由超类实现的接口,也不包括作为包含的接口的超接口的接口。比如,Iterable 和 Collection 等从上面遗漏,即使 ArrayList 隐式实现它们。要找到它们,您必须递归迭代类层次结构。
幸运的是,这种差异不会影响 instanceof。比如 new ArrayList<>() instanceof Iterable 和 Iterable.class.isAssignableFrom(ArrayList.class) 结果为 true。
JDK 中的这些集合的实际设计和实现,“可读性”也是很重要的一部分。
推荐阅读
别不信,你可能连 MySQL 的 Delete 都不会!
Like 查询,%百分号在前 ‘%xttblog’ 到底走不走索引?
这些 MySQL 面试题你会多少?
搞定 Web 容器,就能在 Java 领域风生水起?
手把手教你MySQL中查询回表
如何通过抓包实战来学习Web协议?
10T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,GO等等。在公众号内回复对应关键字或框架名字,即可免费获取!!
你再主动一点点 我们就有故事了