本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序

腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近看了 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?
这是一个很好的问题,是一个我从来都没注意过和思考过的问题。

大致给大家翻译一下,为什么要这样做?
Java 中其实有很多集合 Collection 都有这样的神操作。比如:HashSet 继承了 AbstractSet 并实现 Set,但 AbstractSet 已经实现 Set。HashMap extends AbstractMap,AbstractMap implements Map 等。
为什么要这样做呢?根据上面的解释,其中一个很重要的原因是:规范。如果不实现对应的抽象类也不会有影响,只是实现对应抽象类后能帮助我们理解代码,而无需通过给定类的完整层次结构。
第二个,在反射上可以观察到它们的差异。比如,下面的代码:
for (Class<?> c : ArrayList.class.getInterfaces())
System.out.println(c);
运行后,输出下面的结果:
interface java.util.List
interface java.util.RandomAccess
interface java.lang.Cloneable
interface java.io.Serializable
通过上面的结果,你会发现,List 其实 extends Collection 接口,但是 Collection 接口并没被打印出来。也就是说上面的输出不包括由超类实现的接口,也不包括作为包含的接口的超接口的接口。比如,Iterable 和 Collection 等从上面遗漏,即使 ArrayList 隐式实现它们。要找到它们,您必须递归迭代类层次结构。
幸运的是,这种差异不会影响 instanceof。比如 new ArrayList<>() instanceof Iterable 和 Iterable.class.isAssignableFrom(ArrayList.class) 结果为 true。
JDK 中的这些集合的实际设计和实现,“可读性”也是很重要的一部分。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!