AbstractCollection
实施Collection
。那么为什么AbstractCollection
存在,为什么我们使用Collection
而不是直接使用AbstractCollection
?
答案 0 :(得分:4)
也许回答有点晚了,但是以防万一我想回答这个问题。
AbstractCollection
是因为所有子集合都共享某些功能,如Krzysztof所说,并且由于该功能是通用的(代码行完全相同),我们可以使用继承来重新使用该代码,使设计更简洁,更易于理解且更易于维护。
我们使用该接口,因为接口定义了实现该接口的每个类都必须提供的“合同”,即子类必须具有的方法。这个问题类似于,为什么我们不能使用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
,该类保留了基本方法size
和iterator
的抽象,但是根据它们实现了常规方法。例如:
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);
}
}