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

标签 java polymorphism

我研究了多态性,了解到它可以像下面这样进行动态方法绑定(bind)。

假设类 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();
}

我曾经像这样创建 ArrayList 的实例:

ArrayList myList = new ArrayList();

但通常我认为人们会写:

Collection myList = new ArrayList();

所以我的困惑是声明为 Collection 有什么好处?我也不知道你可以在“myList”前面有“Collection”(它是一个接口(interface)而不是抽象类)。

为什么只说:

ArrayList myList = new ArrayList();

我看了Collection接口(interface)和ArrayList Java文档以及网上教程,但还是不太清楚.. 谁能给我一些解释?

最佳答案

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

请注意,在 CollectionArrayList 之间,还有另一个抽象级别:List界面。通常,列表的使用模式与映射、集合或队列的使用模式非常不同。因此,一份工作所需的 Collection 品类型通常在早期就已决定,并且不会改变。将您的变量声明为 List 可以明确此决定,并为其客户提供有关此集合所遵守的契约(Contract)的有用信息。 Collection OTOH 除了遍历其元素外通常不是很有用。

关于java - 使用 Collection 接口(interface)创建 ArrayList 对象的多态性有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356113/

相关文章:

java - 运行旧版本的Jar文件

java - 信息 : WebSocket connection closed, 代码:尝试运行 websocket 示例时出现 1006

c++ - 为什么重写的方法会隐藏所有具有相同名称的方法,无论其参数如何

php - 如何在 Laravel 中使用具有多态关系的 "group by"?

java - JList 列表项被压缩

Java 开发人员在 Mac OS 上遇到 Objective-C

java - 使用 MapReduce 将数据批量插入 HBase

java - 非通用子类继承(实现)通用父类(super class)(接口(interface))

oop - 在 Haskell 中创建绑定(bind)到记录的方法

c# - 多态与职责划分 : how to avoid 'switching on type'