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

点击上方“业余草”,选择“置顶公众号”

第一时间获取技术干货和业界资讯!

ce9310847a74ed0e61605e63c58ba893.png

昨天太忙,回来的很晚。很多人私信我,我在睡前都一一回应了。今天由于比较匆忙,就把很久之前写的文章推荐给大家!

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

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

Java 中其实有很多集合 Collection 都有这样的神操作。比如:HashSet 继承了 AbstractSet 并实现 Set,但 AbstractSet 已经实现 Set。HashMap extends AbstractMap,AbstractMap implements Map 等。

为什么要这样做呢?根据上面的解释,其中一个很重要的原因是:规范。如果不实现对应的抽象类也不会有影响,只是实现对应抽象类后能帮助我们理解代码,而无需通过给定类的完整层次结构。

第二个,在反射上可以观察到它们的差异。比如,下面的代码:

a258334bd3dfdcb6d4ce3a8a1e5f9595.png

运行后,输出下面的结果:

73cc2ed0898311d1dc96120a5eaebf9b.png

通过上面的结果,你会发现,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协议?

3e722aefa27c61b50193565852454643.png

10T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,GO等等。在公众号内回复对应关键字或框架名字,即可免费获取!!

fcf7593dd7e772054e58963cf49b2f7c.png

 你再主动一点点 c98fe6eec23df70cd1fdb0f775b17175.gif  我们就有故事了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值