面试题:为什么Java中的Collection类都继承了抽象类还实现了抽象类的接口?

JAVA herman 403浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近看了 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?

这是一个很好的问题,是一个我从来都没注意过和思考过的问题。

stackoverflow 热门问题

大致给大家翻译一下,为什么要这样做?

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)!可加作者微信号1:xmtxtt(5000人已满),微信号2:codedq(5000人已满),微信号3:xttblog(超2800)。备注:“xttblog”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 面试题:为什么Java中的Collection类都继承了抽象类还实现了抽象类的接口?