7

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

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

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

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

6 回答 6

11

它被称为接口编程。它允许您将其替换ArrayList为 a LinkedListif 在某处您认为 aLinkedList更合适。

于 2012-06-13T02:29:26.110 回答
4

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

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

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

于 2012-06-13T02:29:50.027 回答
2

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

于 2012-06-13T02:30:36.007 回答
2

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

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

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

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

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

于 2012-06-13T03:14:48.983 回答
1

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

于 2012-06-13T02:42:16.003 回答
0

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

于 2013-03-06T12:33:52.817 回答