【发布时间】:2015-10-25 03:11:18
【问题描述】:
任何想要访问java.util.ArrayList 设施的用户都必须遵守java.util.List 中提供的使用合同。
但是可以很容易地打破这个使用合同并访问方法trimToSize
public void trimToSize() { ... }
和ensureCapacity
public void ensureCapacity(int minCapacity) { ...}
因为这两个方法既不是从java.util.AbstractList 覆盖,也不是从java.util.List 实现。
那么,为什么这两种方法都提供public级别的访问,并打破了java.util.List提供的抽象?
【问题讨论】:
-
这些方法是附加功能。我认为他们没有违反
java.util.List中的任何合同,因为所有这些功能也(大概)正确实现了。您认为他们以何种方式违约? -
java.util.List提供的抽象是如何被这些ArrayList方法“破坏”的?这有点像说狗“打破了'哺乳动物'的抽象概念”,因为它们可以吠叫,而吠叫不是“哺乳动物”抽象概念的一部分。 -
所以你是说子类永远不能用公共方法扩展它们的超类的接口?
-
@TedHopp 这里的抽象将接口(@987654335@)与实现(
ArrayList/LinkedList)分开。此抽象的目的是仅通过接口(@987654338@)访问列表工具。我说的对吗?
标签: java arraylist collections abstraction