AbstractCollection的目的是什么?

时间:2014-10-11 20:48:21

标签: java

AbstractCollection实施Collection。那么为什么AbstractCollection存在,为什么我们使用Collection而不是直接使用AbstractCollection

5 个答案:

答案 0 :(得分:4)

也许回答有点晚了,但是以防万一我想回答这个问题。

    使用
  1. AbstractCollection是因为所有子集合都共享某些功能,如Krzysztof所说,并且由于该功能是通用的(代码行完全相同),我们可以使用继承来重新使用该代码,使设计更简洁,更易于理解且更易于维护。

  2. 我们使用该接口,因为接口定义了实现该接口的每个类都必须提供的“合同”,即子类必须具有的方法。这个问题类似于,为什么我们不能使用ArrayList而不是List来做到这一点,但是您有90%的时间会对添加/设置,删除和知道{{ 1}}和ArrayList接口向您保证,在新的位置之后编写的所有内容都将实现此方法(及其他方法),因此您可以调用它们,而多态性将起作用。另外,使用接口作为引用可以使您更改具体实现的类型而不更改任何内容(仅更改新调用),还可以使用特定的类引用在运行时更改特定的类型,参考,仅此而已。

答案 1 :(得分:1)

代码是最好的文档:-)可以在JDK中检查源,例如在code-grep pages中。

你可以看到,AbstractCollection类(至少在java 6b-14中)提供了isEmpty()contains()toArray()的直接实现, toArray(T[] a)remove(Object o)containsAll(Collection<?> c) addAll(Collection<? extends E> c)removeAll(Collection<?> c)retainAll(Collection<?> c)clear()toString()

提到的方法取决于add(E e)iterator()和(可选)remove(Object o)的实现。

答案 2 :(得分:1)

添加到@Angelixus在https://stackoverflow.com/a/58513874/139985中说的话:

不这样做的一个原因:

AbstractCollection col = (AbstractCollection) someCollection;

不能保证Collection的子类型扩展AbstractCollection基类。

大多数(如果不是全部)标准集合类型确实可以扩展此基类。但是,这可能不适用于所有第三方收集类。如果遇到在未扩展AbstractCollection的情况下实现的集合类,则上面的内容将给出编译错误或运行时异常,具体取决于someCollection声明类型。 / p>

答案 3 :(得分:1)

Collection接口声明所有实现类都必须提供的有用方法。但是麻烦的是,每个实现Collection接口的类都必须提供这么多的方法。

为了使我们的生活更轻松,该库提供了一个类AbstractCollection,该类保留了基本方法sizeiterator的抽象,但是根据它们实现了常规方法。例如:

public abstract class AbstractCollection<E>
    implements Collection<E>
{
    ...
    public abstract Iterator<E> iterator();
    public boolean contains(Object obj)
    {
        for (E element : this) // calls iterator()
            if (element.equals(obj))
                return true;
        return false;
    }
    ...
}

具体集合类现在可以扩展AbstractCollection类。现在由我们来提供iterator方法,但是contains超类已经处理了AbstractCollection方法。但是,如果子类具有更有效的实现contains的方式,则可以这样做。 但是这种方法有点过时了

答案 4 :(得分:-2)

AbstractCollection用于实现不可修改的集合。

public class Demo { 
    public static void main(String[] args) { 
        // Create an empty collection 
        AbstractCollection<Object> 
            abs = new ArrayList<Object>(); 
        // Use add() method to add 
        // elements in the collection 
        abs.add("53"); 
        abs.add("To"); 
        abs.add("Demo"); 
        abs.add("4"); 
        abs.add("Dear"); 
        // Displaying the Collection 
        System.out.println("printing the abstract Collection: " + abs); 
    } 
}