【问题标题】:Why assign a new ArrayList to a List variable?为什么要将新的 ArrayList 分配给 List 变量?
【发布时间】:2012-06-15 23:20:49
【问题描述】:

我是 java 新手,当我浏览网上许多示例的代码时,我看到人们在几乎所有情况下都将 ArrayList 的变量声明为简单的 List

List<String> myList = new ArrayList<String>();

我不明白这样做是否有一些特定的优势。为什么它不能是 ArrayList 本身,像这样:

ArrayList<String> myList = new ArrayList<String>();

【问题讨论】:

标签: java


【解决方案1】:

它叫做programming to an interface。它允许您将 ArrayList 替换为 LinkedList,如果在某处您认为 LinkedList 更合适。

【讨论】:

  • 虽然,第一句话是好的,... 如果您认为 LinkedList 更合适,它允许您用 ArrayList 代替 LinkedList。 听起来不对
  • @OpDeCirkel 这听起来有什么问题?这是对接口进行编程的优势之一。
【解决方案2】:

因为如果您决定稍后更改它会更容易:

List<String> myList = new ArrayList<String>();
List<String> myList = new LinkedList<String>();

在方法签名中更重要的是,当更改返回的内容时,可能会迫使使用您的函数的每个人都更改他们的代码。

【讨论】:

    【解决方案3】:

    这不是强制转换,而是您将接口用作变量的声明类型。这样做的原因是您可以切换您正在使用的 List 的实现。如果列表的用户只依赖于 List 接口,如果你使用其他列表类型,例如 LinkedList,他们不会受到影响。

    【讨论】:

    • 我猜,不是说 interface 作为声明的类型,而是说 interface 作为变量的声明类型
    【解决方案4】:

    Java 是强类型的面向对象语言。 …… 我们来看一个例子:假设你正在编写一个排序函数sort(ArrayList&lt;&gt; list)。如果以这种方式声明的函数,java 将不允许您使用该函数对ArrayList 之外的任何其他内容进行排序。更好的方法是定义一个抽象(就像你的问题一样)List。在该抽象中,您声明了方法。所有实现都必须实现-定义(即ArrayList)。现在您的sort 函数可以声明为sort(List&lt;&gt; list),您可以使用它对任何实现List 的东西进行排序(并遵循List 方法的约定)。
    通过这种方式,您可以重用您为所有实现编写的代码,只要它们遵守抽象的约定。在 Java 中,您使用 interfaces 作为抽象和 classes 作为实现来实现这一点。还有其他优点,但是如果您想更好地理解它们,您已经阅读了一些有关面向对象编程的书。

    【讨论】:

      【解决方案5】:

      List 是一个接口,因此它可以存储对从 List 接口扩展的所有类的引用。如果您使用以下语句,那么在一些编程步骤之后,您还可以存储其他对象(从 List 扩展)引用。

       List<String> myList = new ArrayList<String>(); 
       ...
       myList =new LinkedList<String>();
      

      这样做的主要优点是代码维护。例如,如果有人来并想要使用 LinkedList 而不是 ArrayList,那么您只需要更改一行而不是在整个代码中更改无数行。它使您的代码更加灵活。

      java 中多态性的整个概念依赖于 java 使用接口/基类引用来引用子类对象的能力。

      此外,针对接口而非实际实现进行编程始终被视为最佳实践。这将允许开发人员在需要时轻松地用其他/更好的实现替换一个实现。

      【讨论】:

        【解决方案6】:

        1)List是一个接口,实现类是ArrayList
        2)List接口扩展Collection

        【讨论】:

          猜你喜欢
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          • 2022-10-05
          • 1970-01-01
          • 1970-01-01
          • 2013-02-05
          • 2015-08-11
          • 2018-03-01
          相关资源
          最近更新 更多