V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lucasji
V2EX  ›  Java

关于子类和父类同时实现某一接口的疑惑

  •  
  •   lucasji · 2023-01-09 11:53:30 +08:00 · 2037 次点击
    这是一个创建于 688 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在阅读 JDK 源码的时候,发现了很多子类在父类已经实现了某一接口的情况下,依旧选择去实现这一接口。有没有大佬能解释一下这么做的原因?是为了提升代码可读性吗?随文附上LinkedHashMap的例子:

    public class LinkedHashMap<K,V>
        extends HashMap<K,V>
        implements Map<K,V>
    { // 省略实现 }
    
    

    上面代码中,LinkedHashMapHashMap都实现了Map接口。

    10 条回复    2023-01-09 20:28:19 +08:00
    AoEiuV020CN
        1
    AoEiuV020CN  
       2023-01-09 12:13:44 +08:00   ❤️ 1
    确实没啥用,我猜只是强调一下吧,
    总不能是复制粘贴不小心加上去就懒得删除了吧,
    chendy
        2
    chendy  
       2023-01-09 13:29:40 +08:00   ❤️ 1
    提高可读性,强调一下自己实现了某某接口
    没有啥别的效果
    lucasji
        3
    lucasji  
    OP
       2023-01-09 13:43:06 +08:00
    @AoEiuV020CN 这么看来确实是为了提高可读性,因为不仅是 JDK ,Spring 的源码里面也有这种写法。
    zjp
        4
    zjp  
       2023-01-09 13:56:04 +08:00 via Android   ❤️ 1
    https://stackoverflow.com/a/18558649
    My understanding is that they did so for documentation purposes: the authors wanted to show that ArrayList<E> is primarily a List<E>; the fact that ArrayList<E> extends AbstractList<E> is a less significant detail of its implementation.

    类似的还有 List 重新声明了 Collection 的很多方法,文档几乎没有区别
    dqzcwxb
        5
    dqzcwxb  
       2023-01-09 14:12:50 +08:00
    可以保证父类实现方法变更的情况下,子类不会受到影响
    nielinjie
        6
    nielinjie  
       2023-01-09 14:30:08 +08:00   ❤️ 2
    是否继承父类,远没有是否实现一个接口重要。所以尽量随时随地写明是否实现一个接口。
    请参照我以前的一个回答。

    接口和抽象类在实际应用中如何选择? - 聂同学的回答 - 知乎
    https://www.zhihu.com/question/314514470/answer/626587005
    fang23
        7
    fang23  
       2023-01-09 14:53:58 +08:00
    帮顶,以前想过这个问题,但是没找到答案
    xiang0818
        8
    xiang0818  
       2023-01-09 15:46:41 +08:00   ❤️ 1
    lookStupiToForce
        9
    lookStupiToForce  
       2023-01-09 16:43:31 +08:00   ❤️ 1
    个人感觉是对现阶段 [码代码工具] 的一种妥协

    当你一个子类继承了 N 多个基类(多继承)/一个子类有 N 层继承(多重继承)的时候,你就知道重新声明一遍是多么明智的选择了
    就跟 python 里强调不要使用 from package import * 类似
    如果这样用,则很可能每次你找个名称的出处都要找半天它到底出自哪个包,还要检查有没有重复声明 /定义🤣
    SACKJJKLL
        10
    SACKJJKLL  
       2023-01-09 20:28:19 +08:00
    我一直以为是什么高级写法,现在看来这是一种无意义的做法👀
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3904 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:25 · PVG 18:25 · LAX 02:25 · JFK 05:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.