[ Java ] [IDEA Bug?] List 接口中 boolean add(E) 方法到底是由覆盖了 Collection 接口而来,还是继承自 Collection 接口而来?

2017-06-09 17:13:31 +08:00
 wuyukai

如图,用 IDEA 左栏的 Structure 方式查看 List 接口的结构。

如下显示,上半部分表示覆盖了 Collection 接口的方法,标注出来的有 add 和 addAll 方法。下半部份表示继承自 Collection 接口的方法,标注出来的也是 add 和 addAll 方法。

那么问题来了

这其中显示覆盖关系或继承关系。两个 add 和两个 addAll 的签名都是一样的,那按我目前知识可以理解的就是签名一样,这 List 接口中的方法必然是由覆盖 Collection 接口得到的啊,那么 IDEA 中显示的这个继承关系又是怎么一回事呢?这是 IDEA 中的问题吗?还是说这里面有隐藏的知识点,我没理解到位??

同时我也用反射打印了 List 中所有层级的方法的 log

也并未发现这个继承关系的方法藏在何处。

请大家讨论、指点,多谢。

2504 次点击
所在节点    问与答
8 条回复
0915240
2017-06-09 18:01:35 +08:00
你这是哪个版本的?
raptium
2017-06-09 18:12:18 +08:00
下面不是灰的吗 它的意思是不是被 override 了
wwqgtxx
2017-06-09 20:00:36 +08:00
意思在于你看看代码,Collection 这个接口定义了 add 这个 method,而 List 这个接口也定义了 add 这个 method,而且还是在文件中重新定义了一遍(虽然方法签名都一样)
wwqgtxx
2017-06-09 20:12:00 +08:00
而且他们的 javadoc 部分 @throws 不一样,所以 idea 可能把他们当成了不同的方法看待了吧
wuyukai
2017-06-09 20:15:20 +08:00
@0915240 jdk 1.8,idea 2007.1
wuyukai
2017-06-09 20:17:16 +08:00
@raptium 上面是表示被覆盖,如果下面表示被覆盖的话不会仅仅只显示这两个方法,collection 中的所有方法应该都显示
wuyukai
2017-06-09 20:54:08 +08:00
@wwqgtxx 子接口中包含的父接口中相同的方法,这么做了在机制中就是方法覆盖,而不是重新定义。如图在 IDEA 中显示的 List 中 add 方法实为 Override Collection。

![20170609149701135166466.png]( http://ofrdtlim5.bkt.clouddn.com/20170609149701135166466.png)
确实在 javadoc 中异常的指定不一样,但是 javadoc 始终只是 javadoc,它是被注释的东西,无法对代码产生影响。所以我觉得这两个方法本身设计者是想让他们有所不同的,但是又要保证签名相同在 Java 语法上就没办法做到这一点限制,只能通过 javadoc 的方式来指定这两个的区别,在实现的时候按照指定的 javadoc 来实现,以下是我找到的网上的感觉说的合意的答案。List 中的 add 仅相当于是接口描述上的更加具体吧。
────────────────────────
其实只是定义的接口行为不一样。
表示子类如果实现 List 接口,那就需要遵循 List Javadoc 的行为。
如果实现 Collection 那就必须要遵循 Collection Javadoc 的行为。
不单单只是重写一个方法而已,重写这个方法的时候应该按照 Javadoc 所描述的一样。这样才正确。
SoloCompany
2017-06-10 00:06:57 +08:00
你可以觉得是一个 bug,但我觉得是 JetBrains 是故意的,因为这两个方法签名虽然是完全 override 了,但由于在定义具体化了很多,IDEA 把它等同于另一种形式的覆盖

比如
父类 Base getXXX()
子类 Extend getXXX()

他们的签名不完全一致,但会导致 override,在 Java 1.4 以及之前这种 override 是不允许的
在 1.5 之后开始允许,编译器会给子类自动生成一个 override 的 Base getXXX() 的方法,自动 delegate 给 Extend 后的版本

感觉 IDEA 是模拟为这种情况来生成语法结构,毕竟两个 add 方法的定义实际是不一样的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/367285

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX