使用Collection接口创建ArrayList对象的多态性有什么好处?

mas*_*san 8 java polymorphism

我研究了多态,并了解它可以像下面那样进行动态方法绑定.

假设类Animal是抽象类.

public class AnimalReference
{
  public static void main(String args[])
  Animal ref                 // set up var for an Animal
  Cow aCow = new Cow("Bossy"); // makes specific objects
  Dog aDog = new Dog("Rover");

  // now reference each as an Animal
  ref = aCow; ref.speak();
  ref = aDog; ref.speak();
}
Run Code Online (Sandbox Code Playgroud)

我曾经创建过ArrayList的实例,如:

ArrayList myList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

但通常我认为人们写道:

Collection myList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

所以我的困惑是宣称收藏的好处是什么?另外我不知道你可以在"myList"前面有"Collection"(这是一个非抽象类的接口).

为什么说这不是好习惯:

ArrayList myList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

我阅读了Collection接口和ArrayList Java文档以及在线教程,但仍然不太清楚..有人能给我一些解释吗?

Pét*_*rök 11

如果您声明myListArrayList,则修复其具体类型.使用它的每个人都将依赖于这种具体类型,并且很容易(甚至是无意中)调用特定的方法ArrayList.如果以后您决定将其更改为eg LinkedListCopyOnWriteArrayList,则需要重新编译 - 甚至可能更改 - 客户端代码.接口编程消除了这种风险.

请注意,在Collection和之间ArrayList,还有另一个抽象层次:List接口.通常,列表的使用模式与地图,集合或队列的使用模式非常不同.因此,工作所需的集合类型通常在早期就已确定,并且不会发生变化.将您的变量声明为a List使得此决定变得清晰,并为其客户提供有关此集合服从的合同的有用信息.CollectionOTOH通常不仅仅是迭代它的元素非常有用.