面試題:爲何Java中的Collection類都繼承了抽象類還要實現抽象類的接口?

第一時間獲取技術乾貨和業界資訊!vue

面試題:爲何Java中的Collection類都繼承了抽象類還要實現抽象類的接口?

昨天太忙,回來的很晚。不少人私信我,我在睡前都一一回應了。今天因爲比較匆忙,就把好久以前寫的文章推薦給你們!git

最近看了 Github 上很火的項目,star 超過了 vue。就想看看 github 的 star 排行榜,看完以後,我忽然想到能不能看看 stackoverflow 上的排行榜。作一些翻譯也很不錯!github

在打開 stackoverflow 的時候,忽然看到一個很稀奇的問題。爲何Java中的Collection類都繼承了抽象類還要實現了抽象類的接口?面試

Why do many Collection classes in Java extend the abstract class and implement the interface as well?ide

這是一個很好的問題,是一個我歷來都沒注意過和思考過的問題。翻譯

面試題:爲何Java中的Collection類都繼承了抽象類還要實現抽象類的接口?
大體給你們翻譯一下,爲何要這樣作?設計

Java 中其實有不少集合 Collection 都有這樣的神操做。好比:HashSet 繼承了 AbstractSet 並實現 Set,但 AbstractSet 已經實現 Set。HashMap extends AbstractMap,AbstractMap implements Map 等。blog

爲何要這樣作呢?根據上面的解釋,其中一個很重要的緣由是:規範。若是不實現對應的抽象類也不會有影響,只是實現對應抽象類後能幫助咱們理解代碼,而無需經過給定類的完整層次結構。繼承

第二個,在反射上能夠觀察到它們的差別。好比,下面的代碼:遞歸

面試題:爲何Java中的Collection類都繼承了抽象類還要實現抽象類的接口?

運行後,輸出下面的結果:

面試題:爲何Java中的Collection類都繼承了抽象類還要實現抽象類的接口?

經過上面的結果,你會發現,List 其實 extends Collection 接口,可是 Collection 接口並沒被打印出來。也就是說上面的輸出不包括由超類實現的接口,也不包括做爲包含的接口的超接口的接口。好比,Iterable 和 Collection 等從上面遺漏,即便 ArrayList 隱式實現它們。要找到它們,您必須遞歸迭代類層次結構。

幸運的是,這種差別不會影響 instanceof。好比 new ArrayList<>() instanceof Iterable 和 Iterable.class.isAssignableFrom(ArrayList.class) 結果爲 true。

JDK 中的這些集合的實際設計和實現,「可讀性」也是很重要的一部分

相關文章
相關標籤/搜索