我是java的新手,当我在网上查看许多示例的代码时,我发现在几乎所有情况下,人们都认为ArrayList
的变量只是List
。
List<String> myList = new ArrayList<String>();
我不明白这样做是否有一些特定的优势。为什么不能成为ArrayList
本身,如此:
ArrayList<String> myList = new ArrayList<String>();
答案 0 :(得分:9)
它被称为programming to an interface。它允许您将ArrayList
替换为LinkedList
,如果您认为某个LinkedList
更合适,则可以使用{{1}}。
答案 1 :(得分:3)
因为如果您决定稍后更改它会更容易:
List<String> myList = new ArrayList<String>();
List<String> myList = new LinkedList<String>();
在方法签名中更重要的是,当您更改返回的内容时,可能会强制每个人使用您的函数更改其代码。
答案 2 :(得分:2)
这不是演员,而是您使用接口作为变量的声明类型。这样做的原因是您可以切换正在使用的List的实现。如果列表的用户仅依赖于List接口,那么如果您使用其他列表类型(例如LinkedList),他们将不会受到影响。
答案 3 :(得分:1)
Java是强类型的面向对象语言。 ....
我们来看一个例子:假设你正在编写一个排序函数sort(ArrayList<> list)
。如果以这种方式声明函数,java将不允许您使用该函数对ArrayList
以外的任何其他函数进行排序。更好的方法是定义抽象(如你的问题所示)List
。在那个抽象中,你声明了方法。所有实现必须实现-define(即ArrayList)。现在,您的sort
函数可以声明为sort(List<> list)
,您可以使用List
对其进行排序(并遵循List
方法的约定)。
通过这种方式,您可以重用为所有实现编写的代码,只要它们遵守抽象的契约即可。在Java中,您可以使用 interfaces 作为抽象和类作为实现来实现此目的。还有其他一些优点,但如果你想更好地理解它们,你已经阅读了一些关于面向对象编程的书。
答案 4 :(得分:1)
List是一个接口,因此它可以将referance存储到从List Interface扩展的所有类。如果您使用了以下语句,那么在一些编程步骤之后,您还可以存储其他对象(从List扩展)referance。
List<String> myList = new ArrayList<String>();
...
myList =new LinkedList<String>();
主要优势在于代码维护。例如,如果有人来并希望使用LinkedList而不是ArrayList,则只需在整个代码中更改一行而不是数十亿。它使您的代码更灵活。
java中的多态性的整个概念依赖于java使用接口/基类引用来引用子类对象的能力。
此外,编程到接口而不是实际实现始终被视为最佳实践。这将允许开发人员在需要时轻松地用其他/更好的实现替换一个实现。
答案 5 :(得分:0)
1)List
是一个接口,实现类是ArrayList
2)List
接口扩展Collection
。