java中ArrayList类的父类AbstractList类已经实现过了List接口,为什么还让它再去实现List接口,这样做不是多余了吗?

code__fan 2016-08-05 05:10:04
而且像这样的设计在java类库中还不少见,听别人说这样做只是为了代码规范,看了方便,一看就知道实现了List接口,不然得跳到父类才知道。但总感觉这样做似乎还有别的用意。

以下为截取的头部,详情可以看源码。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {


public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{


不知道是否有人能指点指点。
...全文
697 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
code__fan 2016-08-13
  • 打赏
  • 举报
回复
引用 7 楼 lkx_founder 的回复:
在坐的各位,看看写这个源代码的大师是怎么解释的?stackoverflow里面的答案 解释:I've asked Josh Bloch, and he informs me that it was a mistake. He used to think, long ago, that there was some value in it, but he since "saw the light". Clearly JDK maintainers haven't considered this to be worth backing out later. 这是链接:http://stackoverflow.com/questions/2165204/why-does-linkedhashsete-extend-hashsete-and-implement-sete
谢谢,我看完了,也许设计者确实是犯了一个"mistake"吧,不过里面有一种说法是说在反射时更容易获得那个接口而不用去递归从父类中获得,这个确实会方便一些。还有一个人说与javadoc的生成有关。我觉得也挺有道理的。
lkx_founder 2016-08-12
  • 打赏
  • 举报
回复
引用 10 楼 soton_dolphin 的回复:
[quote=引用 7 楼 lkx_founder 的回复:] 在坐的各位,看看写这个源代码的大师是怎么解释的?stackoverflow里面的答案 解释:I've asked Josh Bloch, and he informs me that it was a mistake. He used to think, long ago, that there was some value in it, but he since "saw the light". Clearly JDK maintainers haven't considered this to be worth backing out later. 这是链接:http://stackoverflow.com/questions/2165204/why-does-linkedhashsete-extend-hashsete-and-implement-sete
这可能是一个玩笑吧,毕竟真的email 内容都没贴出来[/quote] 这不太可能是玩笑,好像提问的那个人是谷歌的员工
NewMoons 2016-08-12
  • 打赏
  • 举报
回复
我承认答复这个帖子时没有认真看楼主的意思,只是根据别人回帖做了猜测。 仔细看了看,这的确是一个冗余设计。
scmod 2016-08-12
  • 打赏
  • 举报
回复
感觉只是getInterface时候能直接拿到...好像没别的区别...
soton_dolphin 2016-08-12
  • 打赏
  • 举报
回复
引用 7 楼 lkx_founder 的回复:
在坐的各位,看看写这个源代码的大师是怎么解释的?stackoverflow里面的答案 解释:I've asked Josh Bloch, and he informs me that it was a mistake. He used to think, long ago, that there was some value in it, but he since "saw the light". Clearly JDK maintainers haven't considered this to be worth backing out later. 这是链接:http://stackoverflow.com/questions/2165204/why-does-linkedhashsete-extend-hashsete-and-implement-sete
这可能是一个玩笑吧,毕竟真的email 内容都没贴出来
sky_08_06_02 2016-08-12
  • 打赏
  • 举报
回复
引用 3 楼 NewMoons 的回复:
楼主问的这个问题很经典,曾经也是我的迷惑。我就把我自己的理解说一下,仅供参考。 楼上有人说了,抽象类是一种模板式设计,我基本同意,那这个模板到底起什么作用呢?为什么不直接设计成实现类呢? 首先接口意义在于规范设计,但接口是没有具体实现的(1.8版本之后的静态方法除外),所有继承它的类都需要一个个实现它的所有方法。 但是呢接口可能有些方法具有一定的通用性,也就是说不需要所有实现类都单独实现(实现了代码也是重复的),有一个类实现这几个方法,大家都去继承它好了,剩下的接口大家各自实现,这就是模板类的意义。 现在关键问题来了,为什么要把这个模板类定义成抽象类呢?其实上面已经给出了答案,因为继承接口的实现类必须要实现接口的所有方法,而模板类仅仅是为了实现一些通用方法不需要实现所有接口方法(总不能为了提供这个模板,稀里糊涂的把所有接口方法都实现了吧,没有必要不说,还和可能产生不必要的使用。),这时候抽象类就符合这个需求了。 抽象类实现了通用的接口,剩下的接口谁继承我谁实现,而且抽象类本身又不能实例化,不会产生没有实现的接口滥用。既实现了代码的最大化复用,又实现了代码的最大化精简。类似 高内聚,低耦合?呵呵随口说的 以上仅仅是个人的理解,欢迎大家指正和补充。
lkx_founder 2016-08-11
  • 打赏
  • 举报
回复
在坐的各位,看看写这个源代码的大师是怎么解释的?stackoverflow里面的答案 解释:I've asked Josh Bloch, and he informs me that it was a mistake. He used to think, long ago, that there was some value in it, but he since "saw the light". Clearly JDK maintainers haven't considered this to be worth backing out later. 这是链接:http://stackoverflow.com/questions/2165204/why-does-linkedhashsete-extend-hashsete-and-implement-sete
code__fan 2016-08-06
  • 打赏
  • 举报
回复
引用 1 楼 wlwlwlwl015 的回复:
常说的java的接口可以看作一种标准和规范,并不是仅仅只为了让你使用它的某些方法,在设计上应该也是这种道理,AbstractList是抽象类,接口和抽象类在设计层面上也是存在很大区别的,抽象类是一种模板式设计,而接口则是类似于辐射式的设计,个人拙见
谢谢,大概懂了,不过楼下的回答更清楚。
code__fan 2016-08-06
  • 打赏
  • 举报
回复
引用 2 楼 soton_dolphin 的回复:
更明确的告诉你这个类都继承了或者实现了哪些方法,不用往回一个一个的找了。而且这样也安全,不会漏掉一些抽象的方法
除此之外,还可以起到一个标记的作用,可以看看3楼的回答
code__fan 2016-08-06
  • 打赏
  • 举报
回复
引用 3 楼 NewMoons 的回复:
楼主问的这个问题很经典,曾经也是我的迷惑。我就把我自己的理解说一下,仅供参考。 楼上有人说了,抽象类是一种模板式设计,我基本同意,那这个模板到底起什么作用呢?为什么不直接设计成实现类呢? 首先接口意义在于规范设计,但接口是没有具体实现的(1.8版本之后的静态方法除外),所有继承它的类都需要一个个实现它的所有方法。 但是呢接口可能有些方法具有一定的通用性,也就是说不需要所有实现类都单独实现(实现了代码也是重复的),有一个类实现这几个方法,大家都去继承它好了,剩下的接口大家各自实现,这就是模板类的意义。 现在关键问题来了,为什么要把这个模板类定义成抽象类呢?其实上面已经给出了答案,因为继承接口的实现类必须要实现接口的所有方法,而模板类仅仅是为了实现一些通用方法不需要实现所有接口方法(总不能为了提供这个模板,稀里糊涂的把所有接口方法都实现了吧,没有必要不说,还和可能产生不必要的使用。),这时候抽象类就符合这个需求了。 抽象类实现了通用的接口,剩下的接口谁继承我谁实现,而且抽象类本身又不能实例化,不会产生没有实现的接口滥用。既实现了代码的最大化复用,又实现了代码的最大化精简。类似 高内聚,低耦合?呵呵随口说的 以上仅仅是个人的理解,欢迎大家指正和补充。
谢谢,我懂了。由于抽象类并未对接口中的所有方法都进行实现,而只是对接口中的部分方法进行了实现(为了达到多态解耦的目的),还须由子类重新对接口中剩余的抽象方法进行一次实现来完善。所以再给子类声明了一次这个接口,用来对此作个标记。子类写不写上都是可以的,更多的是体现了一种规范。
NewMoons 2016-08-06
  • 打赏
  • 举报
回复
楼主问的这个问题很经典,曾经也是我的迷惑。我就把我自己的理解说一下,仅供参考。 楼上有人说了,抽象类是一种模板式设计,我基本同意,那这个模板到底起什么作用呢?为什么不直接设计成实现类呢? 首先接口意义在于规范设计,但接口是没有具体实现的(1.8版本之后的静态方法除外),所有继承它的类都需要一个个实现它的所有方法。 但是呢接口可能有些方法具有一定的通用性,也就是说不需要所有实现类都单独实现(实现了代码也是重复的),有一个类实现这几个方法,大家都去继承它好了,剩下的接口大家各自实现,这就是模板类的意义。 现在关键问题来了,为什么要把这个模板类定义成抽象类呢?其实上面已经给出了答案,因为继承接口的实现类必须要实现接口的所有方法,而模板类仅仅是为了实现一些通用方法不需要实现所有接口方法(总不能为了提供这个模板,稀里糊涂的把所有接口方法都实现了吧,没有必要不说,还和可能产生不必要的使用。),这时候抽象类就符合这个需求了。 抽象类实现了通用的接口,剩下的接口谁继承我谁实现,而且抽象类本身又不能实例化,不会产生没有实现的接口滥用。既实现了代码的最大化复用,又实现了代码的最大化精简。类似 高内聚,低耦合?呵呵随口说的 以上仅仅是个人的理解,欢迎大家指正和补充。
soton_dolphin 2016-08-05
  • 打赏
  • 举报
回复
更明确的告诉你这个类都继承了或者实现了哪些方法,不用往回一个一个的找了。而且这样也安全,不会漏掉一些抽象的方法
小灯光环 2016-08-05
  • 打赏
  • 举报
回复
常说的java的接口可以看作一种标准和规范,并不是仅仅只为了让你使用它的某些方法,在设计上应该也是这种道理,AbstractList是抽象类,接口和抽象类在设计层面上也是存在很大区别的,抽象类是一种模板式设计,而接口则是类似于辐射式的设计,个人拙见

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧