4

可能重复:
为什么 ArrayList 有“implements List”?

我已经阅读了几篇文章Diff b/w I vs AC以及关于何时使用接口与抽象类的问题。

当我偶然发现 ArrayList 类时,ArrayList 类扩展了 AbstractList 类实现了 List 接口。AbstractList 和 List 有常用的方法,如 add()、remove() 等。

编辑:换句话说,如果 AbstractList 实现 List 为什么 Arraylist 类实现 List

当两者都有共同的方法时,这种组合继承行为设计何时更受欢迎?

public class ArrayList<E> extends AbstractList<E>
        implements List<E>
4

3 回答 3

4

有时我创建一个BaseClass实现接口的抽象IBaseClass并创建ChildClass扩展BaseClass. 我的意思是:

public interface IBaseClass {

}

public abstract class BaseClass implements IBaseClass {

}

public class ChildClass extends BaseClass {

}

现在说我有一个接口IChildClassChildClass实现它。

public class ChildClass extends BaseClass implements IChildClass {

}

并说IBaseClass有方法someMethod。现在,如果您想ChildClass通过实现接口使用 的实例,IChildClass例如:

IChildClass obj = new ChildClass();

然后你不能打电话obj.someMethod()。然后你需要这样做:

public interface IChildClass extends IBaseClass {

}

您可以在Java 1.2 文档中找到该接口java.util.List不扩展的接口java.util.Collection,它在最新版本中是这样做的。java.util.List是当时的最高接口,并且java.util.AbstractList实现ListArrayList. AbstructList依次扩展AbstractCollection. AbstractCollection那时是至高无上的阶级。目前AbstractCollection实现Collection. 因此很明显,遵循这种设计模式是为了牢记 Java 的可扩展模式。

于 2013-01-04T18:46:48.250 回答
3

在这种implements List情况下是多余的。可能要明确此调用实现 List 而不必导航类层次结构。

于 2013-01-04T18:36:47.553 回答
0

AbstractList<E>也实现List<E>了,所以它们是相同的方法。

于 2013-01-04T18:36:31.720 回答